Да приемем следната структура на директорията:
CMakeLists.txt
libA
contents: a.cpp
a.h
src
contents: hello.cpp
target1.cpp
target2.cpp
include
- contents: hello.h
Имам статична библиотека A, използвана в основния изходен код на проекта.
Опит 1:
. . .
add_executable(t1 src/target1.cpp src/hello.cpp)
add_dependancies(libA)
target_include_directories(t1 PRIVATE ${PROJECT_SOURCE_DIR}/include
target_link_libraries(t1 PRIVATE /path/to/libA)
. . .
Това работи за t1
, но ако искам да компилирам target2.cpp
, ще трябва да повторя този процес, следователно hello.o
се генерира два пъти.
Опит 2: Мислех да променя този подход, за да генерирам библиотека с обекти за hello.cpp
и просто да добавя библиотеката с обекти към целите. И все пак получавам проблеми с компилирането, тъй като не може да намери заглавките, дефинирани в библиотека A, тъй като библиотеката с обекти се компилира първо и файловете с heade все още не са копирани в CMakeFiles
.
. . .
add_library(libA src/hello.cpp)
add_executable(t1 src/target1.cpp $<TARGET_OBJECTS:libA>)
add_dependancies(libA)
target_include_directories(t1 PRIVATE ${PROJECT_SOURCE_DIR}/include
target_link_libraries(t1 PRIVATE /path/to/libA)
. . .
Има ли начин да се дефинира зависимост, така че статичната библиотека A да се компилира преди?
CMakeFiles
- къде, как и защо копирате заглавните файлове? - person Angew is no longer proud of SO   schedule 17.01.2018add_library(Foo OBJECT ...)
е библиотека с обекти и е много лоша идея да я използвате, тъй като не можете да използватеtarget_link_libraries
върху нея, така че ако зависи от Bar, ще трябва да преминете:$<TARGET_PROPERTY:Bar,INTERFACE_INCLUDE_DIRECTORIES>
,$<TARGET_PROPERTY:Bar,INTERFACE_COMPILE_OPTIONS>
,$<TARGET_PROPERTY:Bar,INTERFACE_COMPILE_DEFINITIONS>
на ръка, като използватеtarget_include_directories
,target_compile_options
и съответноtarget_compile_definitions
- person Mizux   schedule 18.01.2018