我有cmake的问题.我有,比方说,CMakeLists1有一个CMakeLists2所在的子目录.
在CMakeLists2中,我的目标是一个静态库.我想将它链接到外部库.我就这样做了:
link_directories ("path_to_library")
add_library (project2 ${sources})
target_link_libraries (project2 "name_of_external_lib")
Run Code Online (Sandbox Code Playgroud)
然后,我想在我的project1中使用这个project2中的一个类.我是这样做的:
add_executable (project1 ${sources})
target_link_libraries (project1 project2)
Run Code Online (Sandbox Code Playgroud)
但这根本不起作用.首先,project2没有链接到外部库.只是为了检查,我通过vs10项目属性添加了这个库,并且大小不同.第二件事,不知何故,project1看到了外部库(它在这个项目的库依赖项中),当然找不到它.
问题是什么?
我认为CMake的默认行为是不将project2链接到外部库,而是将两个库链接到可执行文件.从"掌握CMake"一书.
由于静态库不链接到它们所依赖的库,因此CMake必须跟踪库,以便可以在正在创建的可执行文件的链接行上指定它们.
您可以尝试在CMakeLists2中使用绝对路径:
add_library (project2 ${sources})
target_link_libraries (project2 "path to ext lib"/"name of ext lib")
Run Code Online (Sandbox Code Playgroud)
或者你可以添加
link_directories ("path_to_library")
Run Code Online (Sandbox Code Playgroud)
到project1的CMakeLists文件.
如果您真的想要在Visual Studio中执行某些操作,则可以使用此答案中给出的命令在CMake中构建custom_command.它可能看起来像这样(我没有测试它).
set(EXT_LIB "path_to_library/name_of_external_lib")
set(BIG_LIB "path_to_big_lib/name_of_big_lib")
add_library (project2 ${sources})
get_property(PROJ2_LOC TARGET project2 PROPERTY LOCATION)
add_custom_command(OUTPUT ${BIG_LIB}
DEPENDS ${EXT_LIB} project2
COMMAND "lib.exe /OUT:${BIG_LIB} ${EXT_LIB} ${PROJ2_LOC} )
Run Code Online (Sandbox Code Playgroud)
然后,您可以将您的可执行文件与$ {BIG_LIB}链接.
你需要考虑的一些事情:
| 归档时间: |
|
| 查看次数: |
32481 次 |
| 最近记录: |