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/9/blackberry/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)

首先设置库搜索路径:

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更新版本”的问题。

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,请参见和

另一个选择,如果您使用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库

文件: 和

如果外部软件可用,您可以更换
f
target_link_directories(GLBall PUBLIC "/path/to/lib/directory")
target_link_libraries(GLBall mylib)