如何使用 CMake 指定在何处查找共享库?
How to specify where to find a shared library using CMake?
我正在尝试 link 使用 CMake 到共享库。我知道这可以使用 target_link_libraries() 命令来实现。我已经能够让这个工作,但不是我想要的方式。
使用下面的 CMakeLists.txt,我已经能够 link 到共享库。
cmake_minimum_required(VERSION 3.7)
project(DylibTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(DylibTest ${SOURCE_FILES})
target_link_libraries(DylibTest
${CMAKE_SOURCE_DIR}/Resources/libDynamicTest.dylib)
这似乎告诉 linker 查看项目所在的目录。这对于开发来说很好,但是我将如何分发这个项目?最终用户显然不会拥有相同的文件夹。
我试过像这样传递相对路径:
cmake_minimum_required(VERSION 3.7)
project(DylibTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(DylibTest ${SOURCE_FILES})
target_link_libraries(DylibTest /Resources/libDynamicTest.dylib)
执行此操作时,出现以下错误:
No rule to make target `/Resources/libDynamicTest.dylib', needed by `DylibTest'. Stop.
我查看了 target_link_directories() 的文档,但没有帮助。我还在这里查看了许多其他问题。
以防万一,我的意图是使用包含共享库的名为 "Resources" 的文件夹分发可执行文件。我的 CMakeLists.txt 文件应该如何执行此操作?
编辑:针对这个问题被标记为可能与 this question 重复的问题,我承认这个问题基本上是在问同样的事情,那里的答案对我不起作用。
以下是我的 CMakeLists.txt 在尝试对另一个问题接受答案后的样子:
cmake_minimum_required(VERSION 3.7)
project(DylibTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(DylibTest ${SOURCE_FILES})
link_directories(${CMAKE_BINARY_DIR}/Resources)
target_link_libraries(DylibTest DynamicTest)
不幸的是,这不起作用导致出现错误,指出找不到该库。
您可能正在寻找 Creating packages with CPack?这让您可以描述如何将您的项目打包到安装例程中以及安装后的文件布局。
看看https://cmake.org/cmake/help/v3.0/command/find_library.html。
您可以为cmake指定一个或多个备用搜索文件夹来查找库。它还会在您的 OS 的默认库文件夹中查找。
find_library(YOURLIB
NAMES your // without the lib
PATHS ${CUSTOM_LIB_PATH})
然后您可以 link 库
target_link_library(targetname ${YOURLIB})
我正在尝试 link 使用 CMake 到共享库。我知道这可以使用 target_link_libraries() 命令来实现。我已经能够让这个工作,但不是我想要的方式。
使用下面的 CMakeLists.txt,我已经能够 link 到共享库。
cmake_minimum_required(VERSION 3.7)
project(DylibTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(DylibTest ${SOURCE_FILES})
target_link_libraries(DylibTest
${CMAKE_SOURCE_DIR}/Resources/libDynamicTest.dylib)
这似乎告诉 linker 查看项目所在的目录。这对于开发来说很好,但是我将如何分发这个项目?最终用户显然不会拥有相同的文件夹。
我试过像这样传递相对路径:
cmake_minimum_required(VERSION 3.7)
project(DylibTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(DylibTest ${SOURCE_FILES})
target_link_libraries(DylibTest /Resources/libDynamicTest.dylib)
执行此操作时,出现以下错误:
No rule to make target `/Resources/libDynamicTest.dylib', needed by `DylibTest'. Stop.
我查看了 target_link_directories() 的文档,但没有帮助。我还在这里查看了许多其他问题。
以防万一,我的意图是使用包含共享库的名为 "Resources" 的文件夹分发可执行文件。我的 CMakeLists.txt 文件应该如何执行此操作?
编辑:针对这个问题被标记为可能与 this question 重复的问题,我承认这个问题基本上是在问同样的事情,那里的答案对我不起作用。
以下是我的 CMakeLists.txt 在尝试对另一个问题接受答案后的样子:
cmake_minimum_required(VERSION 3.7)
project(DylibTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(DylibTest ${SOURCE_FILES})
link_directories(${CMAKE_BINARY_DIR}/Resources)
target_link_libraries(DylibTest DynamicTest)
不幸的是,这不起作用导致出现错误,指出找不到该库。
您可能正在寻找 Creating packages with CPack?这让您可以描述如何将您的项目打包到安装例程中以及安装后的文件布局。
看看https://cmake.org/cmake/help/v3.0/command/find_library.html。
您可以为cmake指定一个或多个备用搜索文件夹来查找库。它还会在您的 OS 的默认库文件夹中查找。
find_library(YOURLIB
NAMES your // without the lib
PATHS ${CUSTOM_LIB_PATH})
然后您可以 link 库
target_link_library(targetname ${YOURLIB})