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
CMake到外部库的链接_Cmake - Fatal编程技术网

CMake到外部库的链接

CMake到外部库的链接,cmake,Cmake,如何让CMake将可执行文件链接到不在同一CMake项目中生成的外部共享库 只需执行target\u link\u库(GLBall${CMAKE\u BINARY\u DIR}/res/mylib.so)就会产生错误 make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop. make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2 make: *** [al

如何让CMake将可执行文件链接到不在同一CMake项目中生成的外部共享库

只需执行
target\u link\u库(GLBall${CMAKE\u BINARY\u DIR}/res/mylib.so)
就会产生错误

make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'.  Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)
在我将库复制到二进制目录
bin/res
之后

我尝试使用
find_库(结果mylib.so路径${CMAKE_BINARY_DIR}/res)


如果
RESULT-NOTFOUND
,首先设置库搜索路径,则失败:

LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)
然后就这么做

TARGET_LINK_LIBRARIES(GLBall mylib)

arrowdodger的回答是正确的,在很多情况下都是首选。我只想在他的回答之外再加上一条:

您可以添加“导入的”库目标,而不是链接目录。比如:

# Your-external "mylib", add GLOBAL if the imported library is located in directories above the current.
add_library( mylib SHARED IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so )
然后链接,就像此库是由您的项目构建的一样:

TARGET_LINK_LIBRARIES(GLBall mylib)
这样的方法会给您更多的灵活性:看看命令和命令


我不知道这是否能解决“更新版本的libs”的问题。

如果您正在使用Appstore,则需要“授权”,因此需要与Apple框架链接

要获得工作授权(例如GameCenter),您需要有一个“链接二进制文件与库”-buildstep,然后链接到“GameKit.framework”。CMake将“低级”库“注入”到命令行中,因此Xcode并不真正了解它,因此您不会在功能屏幕中启用GameKit

使用CMake并拥有“与二进制文件的链接”的一种方法——构建步骤是使用CMake生成xcodeproj,然后使用“sed”来“搜索和替换”,并以XCode喜欢的方式添加游戏套件

脚本如下所示(对于Xcode 6.3.1)

将其保存到“gamecenter.sed”,然后像这样“应用”它(它会更改您的xcodeproj!)

您可能需要更改脚本命令以满足需要

警告:由于项目格式可能发生变化,它可能会与不同的Xcode版本中断,(硬编码的)唯一编号可能不是唯一的-通常其他人的解决方案更好-因此,除非您需要支持Appstore+授权(和自动构建),否则不要这样做


这是一个CMake bug,请参见和

我假设您想链接到一个名为foo的库,它的文件名通常是link
foo.dll
libfoo.so

1。查找库
你必须找到图书馆。这是一个好主意,即使你知道去图书馆的路。如果库消失或获得新名称,则CMake将出错。这有助于及早发现错误,并让用户(可能自己)清楚问题的原因。
要查找库foo并将路径存储在
foo_LIB
中,请使用

    find_library(FOO_LIB foo)
CMake将自行确定实际的文件名。它检查通常的位置,如
/usr/lib
/usr/lib64
路径中的路径

您已经知道库的位置。当您调用CMAKE时,将其添加到
CMAKE\u PREFIX\u路径
,那么CMAKE也会在传递的路径中查找您的库

有时需要添加提示或路径后缀,有关详细信息,请参阅文档:

2。链接库 从1。您在
FOO_LIB
中有完整的库名。您可以使用它将库链接到目标
GLBall
,如中所示

  target_link_libraries(GLBall PRIVATE "${FOO_LIB}")
您应该在目标后添加
PRIVATE
PUBLIC
INTERFACE
,参见文档:

如果不添加这些可见性说明符中的任何一个,它的行为将类似于
PRIVATE
PUBLIC
,具体取决于CMake版本和策略集

3。添加包含项(此步骤可能不是强制性的)。
如果还希望包含头文件,请使用类似于
查找库
查找路径
并搜索头文件。然后添加带有
target\u include\u目录的include目录
,类似于
target\u link\u库

文件: 和


如果可用于外部软件,您可以将
查找库
查找路径
替换为
查找包

假设您有如下可执行文件:

add_executable(GLBall GLBall.cpp)
如果外部库具有标题,请提供其包含文件夹的路径:

target_include_directories(GLBall PUBLIC "/path/to/include")
添加库目录路径:

target_link_directories(GLBall PUBLIC "/path/to/lib/directory")
最后,链接库名称

target_link_libraries(GLBall mylib)
请注意,库文件的前缀和扩展名将被删除:

libmylib.a➜ mylib

迈里布·索➜ mylib

可能是
add\u库(mylib共享导入)
或者您得到一个用导入的参数调用的
add\u库,但没有库类型
error@Andre:我认为在
IMPORTED\u LOCATION
之后,开始括号是错误的。如果要访问当前
add\u库上方目录中的导入库,需要在
IMPORTED
之后添加
GLOBAL
(breakpad静态导入全局)
@SOUser:是的,导入的位置应该指向文件,而不是目录。我已经解决了这个问题,我想作者不会抱怨的。我真的不知道为什么Official不支持这些基本用法!感谢不鼓励使用,即使在它自己的文档中也是如此。我认为在这里解决失败的
find\u libr会更好ary
调用原始问题,或使用@Andre的解决方案。我发现“导入”library target更加健壮,因为它以特定库的位置为目标,而不是简单地给出一个全局搜索路径。请参见Andre的答案。您应该始终使用
find_library
,并使用此路径,而不是硬编码,参见。具体而言,让cmake与外部库链接不是问题(上面有几种解决方案)。以自动化的方式实现这一点,使其与苹果Appstore和授权一起工作是一个挑战
target_link_directories(GLBall PUBLIC "/path/to/lib/directory")
target_link_libraries(GLBall mylib)