Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:将库链接到库_Cmake - Fatal编程技术网

CMake:将库链接到库

CMake:将库链接到库,cmake,Cmake,我对cmake有意见。比如说,我有一个CMakeLists1,它有一个子目录,其中CMakeLists2是 在CMakeLists2中,我的目标是一个静态库。我想把它链接到外部库。 我就是这样做的: link_directories ("path_to_library") add_library (project2 ${sources}) target_link_libraries (project2 "name_of_external_lib") 然后,我想在我的项目1中使用这个项目2中的一

我对cmake有意见。比如说,我有一个CMakeLists1,它有一个子目录,其中CMakeLists2是

在CMakeLists2中,我的目标是一个静态库。我想把它链接到外部库。 我就是这样做的:

link_directories ("path_to_library")
add_library (project2 ${sources})
target_link_libraries (project2 "name_of_external_lib")
然后,我想在我的项目1中使用这个项目2中的一个类。我已经做到了:

add_executable (project1 ${sources})
target_link_libraries (project1 project2)
但这根本不起作用。首先,project2没有链接到外部库。只是为了检查,我通过vs10项目属性添加了这个库,大小不同。第二件事,project1看到了外部库(它在这个项目的库依赖项中),当然找不到它


有什么问题吗?

我猜问题可能是外部库的名称不正确,所以找不到它

我同意:

find_library(
    LIB_I_NEED name_of_external_lib
    HINTS "path_to_library"
)

if(${LIB_I_NEED} STREQUAL "LIB_I_NEED-NOTFOUND")
    message(FATAL_ERROR "Couldn't find the 'external_lib' library)
endif()

message(STATUS "Found 'external_lib' at: ${LIB_I_NEED}")

add_library (project2 ${sources})
target_link_libraries (project2 ${LIB_I_NEED})

如果没有帮助,请快速阅读cmake文档中的示例:

其中提到的一件事是:

虽然一次重复通常就足够了,但病态对象文件 而符号安排可能需要更多。我们可以通过以下方式处理此类案件: 手动重复上一个目标链接库中的组件 召唤

所以我想说,另一件事可能是在项目2中:

set(PROJECT_2_LIBS project2 "name_of_external_lib" PARENT_SCOPE)
然后在exe中:

target_link_libraries (project1 ${PROJECT_2_LIBS})

这将使“外部库”链接在两个位置重复,并给您更多的工作机会;)

我认为不将project2链接到外部库是CMake的默认行为, 而是将两个库链接到可执行文件。 来自《掌握CMake》一书

由于静态库不链接到它们所依赖的库,因此 对于CMake来说,重要的是要跟踪库,以便可以在 正在创建的可执行文件的链接行

您可以尝试在CmakeList2中使用绝对路径:

add_library (project2 ${sources})
target_link_libraries (project2 "path to ext lib"/"name of ext lib")
或者你可以加上

link_directories ("path_to_library")
到project1的CMakeLists文件

如果您真的想在VisualStudio中执行类似的操作,您可能可以使用本文中给出的命令在CMake中构建一个自定义的_命令。 它可能看起来像这样(我没有测试它)

然后可以将可执行文件链接到${BIG_LIB}

您必须考虑以下事项:

  • 也许您必须使用LOCATION\u CONFIG(,我在中找到了get\u属性命令)
  • link.exe必须位于您的路径中
  • 如果要在其他CMakeLists.txt中使用BIG_LIB变量,请查看该变量的范围

这看起来像是一个副本,用来检查我的答案。嗯,这实际上有点类似于我的问题。但是,如果一个库是外部库而不是目标库,我如何使用该命令?外部库的名称是共享库还是静态库?@ov3rLoad您只需用库的名称替换
$
位即可。理想情况下,您可以使用
find_library
定位库并将名称存储在变量中。这个变量将取代第二个
$
变量。尽管我现在认为如果找不到它,编译器可能会在某个时候抱怨,呃。。。嗯…-无论如何,希望答案能有所帮助。是的,cmake找到了这个库,但不幸的是问题仍然存在。显然,这些是唯一的选择。我只是不明白,为什么我可以使用“附加库依赖项”在VS10中实现它?如果您使用
SHARED
来构建共享库,然后
target\u link\u libraries
就可以将它们链接到外部lib@Ov3r1oad
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} )