cmake 链接动态链接库

本文介绍了如何在CMake项目中正确配置并使用第三方库。通过设置LINK_DIRECTORIES指定库的搜索路径,并使用TARGET_LINK_LIBRARIES链接指定的库文件。文章还展示了如何确保OpenCV版本兼容性以及具体配置实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用相对路径的时候,你要让cmake能够搜索到找到你动态库,就像直接使用gcc/g++来链接的时候一样,要使用-L来指定第三方库所在路径。
cmake可以使用  LINK_DIRECTORIES 命令来指定第三方库所在路径,比如,你的动态库在
/home/myproject/libs
这个路径下,则通过命令:
LINK_DIRECTORIES(/home/myproject/libs)
把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了,使用TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了,比如:
TARGET_LINK_LIBRARIES(MyApp -lcurl )


cmake_minimum_required (VERSION 2.8) 

PROJECT(WebcamFaceRec)

# Requires OpenCV v2.4.1 or later
FIND_PACKAGE( OpenCV REQUIRED )
IF (${OpenCV_VERSION} VERSION_LESS 2.4.1)
    MESSAGE(FATAL_ERROR "OpenCV version is not compatible : ${OpenCV_VERSION}. FaceRec requires atleast OpenCV v2.4.1")
ENDIF()

SET(SRC
    main.cpp
    detectObject.cpp
    preprocessFace.cpp
    recognition.cpp
    ImageUtils_0.7.cpp
)

#ADD_EXECUTABLE( ${PROJECT_NAME} ${SRC} )
LINK_DIRECTORIES(/usr/lib/arm-linux-gnueabihf)
ADD_EXECUTABLE( ${PROJECT_NAME} ${SRC} )
target_link_libraries(${PROJECT_NAME} -lmysqlclient)
TARGET_LINK_LIBRARIES( ${PROJECT_NAME}  ${OpenCV_LIBS} ${LD_LIBRARY_PATH})
 

### 如何使用 CMake 链接动态库CMake链接动态库可以通过 `add_library` 和 `target_link_libraries` 命令完成。以下是具体方法以及一个完整的示例。 #### 创建动态库 首先,在 CMake 脚本中定义动态库。这可以通过指定 `SHARED` 参数给 `add_library` 来实现: ```cmake add_library(my_shared_lib SHARED ${SOURCE_FILES}) ``` 上述代码会创建一个名为 `my_shared_lib` 的共享库[^1]。这里的 `${SOURCE_FILES}` 是指代源文件列表的变量,例如 `.cpp` 文件。 #### 设置目标属性 为了确保动态库能够被正确构建和链接,可能还需要设置一些目标属性。比如,如果希望导出符号以便其他模块可以访问,则可以在 Windows 平台上使用 `__declspec(dllexport)` 或者在 Linux 上无需额外操作即可自动导出符号。 对于跨平台支持,推荐的方式是在头文件中定义宏来控制符号可见性: ```cpp #ifdef _WIN32 #ifdef MY_SHARED_LIB_EXPORTS #define MY_SHARED_API __declspec(dllexport) #else #define MY_SHARED_API __declspec(dllimport) #endif #else #define MY_SHARED_API #endif ``` 接着,在类声明前加上该宏: ```cpp class MY_SHARED_API MyClass { public: void myFunction(); }; ``` #### 连接到可执行文件或其他库 一旦动态库准备好之后,就可以将其连接至另一个目标(如可执行程序)。这是通过 `target_link_libraries` 实现的: ```cmake add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE my_shared_lib) ``` 这里假设有一个主函数位于 `main.cpp` 中,并且它依赖于之前创建好的 `my_shared_lib` 动态库。 #### 完整实例配置 基于前面提到的内容,给出一个实际例子。假设有这样一个简单的项目结构[^4]: ``` . ├── CMakeLists.txt ├── build/ ├── include/ │ └── shared/ │ └── Hello.h └── src/ ├── Hello.cpp └── main.cpp ``` 对应的 `CMakeLists.txt` 可能看起来像这样: ```cmake cmake_minimum_required(VERSION 3.10) project(MyDynamicLibExample LANGUAGES CXX) set(SOURCES src/Hello.cpp src/main.cpp ) include_directories(include/shared) # 添加动态库 add_library(hello SHARED src/Hello.cpp) # 如果需要安装或者分发这个库的话还可以加入install指令 # install(TARGETS hello DESTINATION lib) # 构建应用程序并与之关联 add_executable(app_main src/main.cpp) target_link_libraries(app_main PRIVATE hello) ``` 在这个案例里,“hello”是一个由单个 cpp 文件组成的简单动态库;而 “app_main” 则代表最终的应用程序入口点,其中包含了调用来自 ‘hello’ 库功能的部分逻辑。 #### 关键路径解析 当涉及到多目录布局时,重要的是要清楚不同类型的 source dir 概念[^3]: - **PROJECT_SOURCE_DIR**: 当前顶层 project 所处位置。 - **CMAKE_CURRENT_SOURCE_DIR**: 正处理中的 cmake list file 居住的位置。 - **CMAKE_SOURCE_DIR**: 整个项目根部所在的地址。 这些概念有助于管理复杂的大型工程,尤其是在子目录中有独立组件的情况下。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值