[注意:这几乎是链接到尚未用CMake构建的库的重复,但在这种情况下,未构建的库来自ADD_CUSTOM_TARGET而不是ADD_LIBRARY,因此CMake无法有效地发挥其通常的魔力。]
我的一个CMake 2.8项目目前有以下代码:
# the COMMAND was heavily simplified but you get the idea
ADD_CUSTOM_TARGET(custom_breakpad_target ALL
COMMAND cd ${CMAKE_SOURCE_DIR}/google-breakpad && make
)
# now here we are in the root "CMakeLists.txt"
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/google-breakpad/src/client/linux)
ADD_EXECUTABLE(hello)
# ...many lines of code...
ADD_DEPENDENCIES(hello custom_breakpad_target)
TARGET_LINK_LIBRARIES(hello breakpad)我知道LINK_DIRECTORIES因为其怪异的位置而遭到了反对(或者至少是不屑一顾)(它必须位于ADD_EXECUTABLE之前,尽管我们真的很想把它放在TARGET_LINK_LIBRARIES旁边)。此外,还有一个漂亮的新命令FIND_LIBRARY。所以我想写根"CMakeLists.txt“,更像这样:
ADD_EXECUTABLE(hello)
# ...many lines of code...
ADD_DEPENDENCIES(hello custom_breakpad_target)
FIND_LIBRARY(breakpad breakpad ${CMAKE_SOURCE_DIR}/google-breakpad/src/client/linux)
TARGET_LINK_LIBRARIES(hello breakpad)这个密码很好..。直到我“打扫干净”。下一次重建无法找到breakpad,因为到FIND_LIBRARY运行时,它已经被rm编辑,而且还没有再次创建。
我怎么才能把这事做好?还是做一些比我的更优雅的工作?
到目前为止,我得到的最好的是
ADD_EXECUTABLE(hello)
# ...many lines of code...
ADD_DEPENDENCIES(hello custom_breakpad_target)
TARGET_LINK_LIBRARIES(hello ${CMAKE_SOURCE_DIR}/google-breakpad/src/client/linux/libbreakpad_client.a)这具有美学上的缺点,即必须显式写出“libxx.a”文件名,而据我所知,即使我们切换到"libxxx.1.so“,FIND_LIBRARY也会毫无怨言地继续工作。
发布于 2013-12-06 09:14:53
通过自定义命令构建外部目标是非常困难的。CMake提供了ExternalProject模块来协助这方面的工作。
有了这个模块,外部库就可以在CMake配置时构建--即第一次运行cmake时,而不是在运行make来构建实际项目时。这有一个优点,即在配置项目时,所有的文件都已经就位,所以使用find脚本或CMake配置文件很容易找到它们。
当然,只有当外部库不经常更改时,这种方法才有意义,因为重新构建库需要再次运行CMake。如果您需要通过只运行make来重新编译外部库,那么使其工作的最好方法仍然是为它编写一个完整的CMakeLists.txt并使用add_subdirectory。
https://stackoverflow.com/questions/20413694
复制相似问题