linux利用CMakeLists编译程序或生成库文件

#设置CMAKE最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#设置项目名称
SET(PROJECT_NAME Image_Test_01)
#建立项目
PROJECT(${PROJECT_NAME})
#寻找OpenCV库
FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
#打印调试信息
MESSAGE(STATUS "Project: ${PROJECT_NAME}")
MESSAGE(STATUS "OpenCV library status:")
MESSAGE(STATUS "    version: ${OpenCV_VERSION}")
MESSAGE(STATUS "    libraries: ${OpenCV_LIBS}")
MESSAGE(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

#获取代码,在项目中,将所有代码都放在src文件夹中
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
MESSAGE(STATUS "Src file: ${DIR_SRCS}")
#编译可执行程序
ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SRCS})
#如果要生成动态链接库
#ADD_LIBRARY(${PROJECT_NAME} SHARED ${DIR_SRCS})
#添加链接库 TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS})

参考:http://blog.youkuaiyun.com/ryuuei_1984/article/details/52209331

转载于:https://www.cnblogs.com/haiyang21/p/7440898.html

<think>好的,我现在需要帮助用户解决在Linux环境下使用CMake生成静态(.a文件)的问题。首先,我得回忆一下CMake的基本用法和生成静态的相关命令。用户可能已经有一定的CMake基础,但可能遇到了具体的问题,比如如何正确配置CMakeLists.txt来生成静态。 首先,我应该考虑静态生成的基本步骤。静态通常是通过编译源代码生成目标文件,然后使用ar工具打包成.a文件。在CMake中,可以使用add_library命令并指定STATIC参数来生成静态。例如,add_library(mylib STATIC source1.cpp source2.cpp)。 然后,用户可能遇到常见的问题,比如生成路径不对,者没有正确清理之前的构建文件导致冲突。根据用户提供的引用[2],如果在重新配置CMake之前没有删除之前的构建文件,可能会出现错误。所以需要提醒用户在重新运行CMake之前执行make clean删除build目录。 接下来,我需要考虑如何组织CMakeLists.txt的结构。比如设置项目名称、添加头文件目录、指定编译选项等。引用[3]中提到的一些命令,比如project()、include_directories()、target_include_directories(),这些都可能需要用到。此外,静态的安装和路径设置也可能需要涉及,比如通过install命令指定安装路径。 用户的问题还可能涉及如何同时生成动态和静态者在同一个项目中管理多个。这时候可能需要设置不同的目标,使用条件判断来控制生成类型。此外,CMake的变量如CMAKE_BUILD_TYPE也可能影响生成结果,需要确保配置正确。 另外,用户可能想知道如何验证生成的静态是否正确,可能需要指导他们使用ar命令查看的内容,者链接测试程序进行验证。还有可能涉及跨平台编译的问题,比如使用工具链文件,如引用[2]中的-DCMAKE_TOOLCHAIN_FILE参数,但用户当前的问题可能不需要这个,除非有特殊架构需求。 最后,需要确保提供的示例代码正确无误,并且步骤清晰。比如,创建一个简单的CMakeLists.txt,演示如何添加静态目标,然后执行cmake和make命令。同时,提醒用户清理构建目录和可能的权限问题,比如安装时是否需要sudo。 总结下来,回答的结构应该是先介绍基本方法,给出示例代码,然后列出注意事项和常见问题,最后提供验证步骤和相关问题。需要引用用户提供的参考资料,特别是关于清理构建文件和正确使用命令的部分,确保回答的准确性和可靠性。</think>在Linux环境下使用CMake生成静态(`.a`文件)需通过`add_library`命令指定`STATIC`参数,并正确配置`CMakeLists.txt`。以下是详细步骤和注意事项: --- ### **步骤说明** 1. **创建CMake项目结构** ```bash mkdir build cd build cmake .. make ``` 2. **编写`CMakeLists.txt`** ```cmake cmake_minimum_required(VERSION 3.10) project(MyStaticLib) # 设置项目名[^3] # 添加静态目标 add_library(mylib STATIC src/mylib.cpp) # 指定STATIC参数生成静态[^3] # 添加头文件搜索路径(可选) target_include_directories(mylib PUBLIC include/) # 头文件目录配置[^3] # 设置输出路径(可选) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 静态默认生成到build/lib/ ``` 3. **编译生成静态** ```bash cmake -B build # 生成构建系统 cmake --build build # 执行编译,生成libmylib.a ``` --- ### **关键注意事项** 1. **清理历史构建文件** 若之前已编译过动态其他类型文件,需先清理构建目录: ```bash rm -rf build/* # 强制清空构建目录[^2] ``` 2. **静态命名规则** CMake默认生成的静态名为`lib<targetname>.a`。如需自定义名称: ```cmake add_library(custom_name STATIC src/mylib.cpp) ``` 3. **同时生成静态和动态** 需定义两个独立目标: ```cmake add_library(mylib_static STATIC src/mylib.cpp) add_library(mylib_shared SHARED src/mylib.cpp) ``` 4. **安装静态** 通过`install`命令指定安装路径: ```cmake install(TARGETS mylib ARCHIVE DESTINATION /usr/local/lib) # 安装到系统目录[^3] ``` 执行安装命令: ```bash sudo cmake --install build # 需要root权限[^1] ``` --- ### **常见问题解决** - **报错`cannot create directory`** 检查目标路径权限,通过`--prefix`指定用户有权限的目录[^1]: ```bash cmake --install build --prefix ~/my_libs/ ``` - **静态未更新** 确保修改`CMakeLists.txt`后**重新生成构建系统**,避免缓存导致配置未生效。 - **链接时找不到符号** 静态需在可执行文件之前链接,例如: ```cmake add_executable(app main.cpp) target_link_libraries(app mylib) # 正确顺序 ``` --- ### **验证静态** 1. **查看文件类型** ```bash file libmylib.a # 输出应为 "current ar archive" ``` 2. **查看符号表** ```bash nm -gC libmylib.a # 显示中函数和变量 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值