cmake:MSVC/MinGW中导入glog静态库的正确方式

本文介绍了解决Windows环境下使用glog静态库时出现的链接错误问题。通过对比Linux下的配置,指出了在CMake配置文件中正确设置宏定义的方法。

在linux下使用glog静态库,编译连接时只要加上glog静态库文件(.a)就可以了,在windows环境,我也同样的办法在自己的项目中使用glog静态库,用msvc/mingw编译。。。然而链接时报错了,无数的错误都是找不到glog的符号(undefined reference)…
我的项目是cmake生成的工程文件,glog也是我自己用cmake编译出来的,为了查找原因我查看了glog提供的cmake脚本。在lib/cmake/glog/glog-targets.cmake文件中找到如下脚本:

set_target_properties(glog::glog PROPERTIES
  INTERFACE_COMPILE_DEFINITIONS "GFLAGS_DLL_DECLARE_FLAG=;GFLAGS_DLL_DEFINE_FLAG=;GLOG_NO_ABBREVIATED_SEVERITIES;GOOGLE_GLOG_DLL_DECL="
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
  INTERFACE_LINK_LIBRARIES "gflags_static"
)

看到这个INTERFACE_COMPILE_DEFINITIONS 属性指定的一堆符号,我明白了。原来在windows下要连接glog静态库,必须要在编译时或在源码中添加下面四个宏定义
GFLAGS_DLL_DECLARE_FLAG,
GFLAGS_DLL_DEFINE_FLAG,
GLOG_NO_ABBREVIATED_SEVERITIES,
GOOGLE_GLOG_DLL_DECL

目的是告诉连接器使用glog静态库的符号表,否则连接器默认会把glog的函数定义当做动态库函数来处理。

如果你是用cmake脚本来编译自己的项目的,如果是用下面的方式来导入glog(caffe就是这么干的,linux下是没问题的),那么连接时肯定会报错,原因就是没加入上面说的宏定义

# GLOG_ROOT_DIR 是glog 的安装路径
find_path(GLOG_INCLUDE_DIR glog/logging.h
PATHS ${GLOG_ROOT_DIR}/include)
find_library(GLOG_LIBRARY glog 
PATHS ${GLOG_ROOT_DIR}/lib)
...
include_directories(${GLOG_INCLUDE_DIR})
target_link_libraries(your_project ${GLOG_LIBRARY})

在cmake中,加入glog静态库的正确方式是这样的:

# GLOG_ROOT_DIR 是glog 的安装路径
find_package(glog REQUIRED CONFIG HINTS ${GLOG_ROOT_DIR})
set(GLOG_INCLUDE_DIR ${GLOG_ROOT_DIR}/include)
# glog::glog is imported target
set(GLOG_LIBRARY glog::glog)
...
target_link_libraries(your_project ${GLOG_LIBRARY})

上面的代码中使用find_package来查找静态库而不是find_library,find_package(glog)会创建一个名为glog:glog的imported target.
glog::glog就是lib/cmake/glog/glog-targets.cmake定义的imported target(本文最开始提到的),因为这个target的INTERFACE_COMPILE_DEFINITIONS属性中指定了上面4个宏定义,所以聪明的cmake在生成Makefile时会自动在your_project target的编译选项中加入-DGFLAGS_DLL_DECLARE_FLAG -DGFLAGS_DLL_DEFINE_FLAG -DGLOG_NO_ABBREVIATED_SEVERITIES -DGOOGLE_GLOG_DLL_DECL
所以就不需要再执行include_directories(${GLOG_INCLUDE_DIR})

关于imported library, 参见 https://cmake.org/cmake/help/v3.8/manual/cmake-buildsystem.7.html#imported-targets

如下是cmake生成的编译工程文件(flags.make)的样例,可以看到CXX_DEFINES 中已经自动添加了上面的4个宏定义,并且将glog include文件夹也自动加到了CXX_INCLUDES

# CMAKE generated file: DO NOT EDIT!
# Generated by "NMake Makefiles JOM" Generator, CMake Version 3.8

# compile CXX with C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
CXX_FLAGS = /wd4996 /wd4267 /wd4244 /wd4018 /wd4800 /wd4661 /wd4812 /wd4309 /wd4305 /wd4819  /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MT /O2 /Ob2 /DNDEBUG  

CXX_DEFINES = -DBOOST_ALL_NO_LIB -DCAFFE_VERSION=1.0.0 -DCMAKE_WINDOWS_BUILD -DCPU_ONLY -DGFLAGS_DLL_DECLARE_FLAG="" -DGFLAGS_DLL_DEFINE_FLAG="" -DGFLAGS_IS_A_DLL=0 -DGLOG_NO_ABBREVIATED_SEVERITIES -DGOOGLE_GLOG_DLL_DECL="" -DUSE_LEVELDB -DUSE_LMDB -DUSE_OPENCV

CXX_INCLUDES = -ID:\caffe-static\source\caffe-windows\build.vs2015\include -ID:\caffe-static\release\opencv_windows_vc140_x86_64_mt\include -ID:\caffe-static\release\opencv_windows_vc140_x86_64_mt\include\opencv -ID:\caffe-static\source\caffe-windows\build.vs2015 -ID:\caffe-static\release\boost_windows_vc140_x86_64_mt\include\boost-1_62 -ID:\caffe-static\release\glog_windows_vc140_x86_64_mt\include -ID:\caffe-static\release\gflags_windows_vc140_x86_64_mt\Include -ID:\caffe-static\release\protobuf_windows_vc140_x86_64_mt\include -ID:\caffe-static\release\hdf5_windows_vc140_x86_64_mt\include -ID:\caffe-static\release\lmdb_windows_vc140_x86_64_mt\include -ID:\caffe-static\release\leveldb_windows_vc140_x86_64_mt\include -ID:\caffe-static\release\OpenBLAS_windows_vc140_x86_64_mt\include -ID:\caffe-static\source\caffe-windows\include 


<think>我们正在解决CLion中CMake配置时出现的C编译器错误问题。错误信息指向CMakeTestCCompiler.cmake文件,通常表示CMake在测试C编译器时失败。根据引用[2]和引用[3]的提示,这可能是由于编译器路径配置不正确编译器本身无法工作导致的。用户提供的编译器路径为:`D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/gcc.exe`解决方案步骤:1.**验证编译器路径**:首先确认该路径下确实存在`gcc.exe`。如果路径中有空格或特殊字符,可能会导致问题,但这里路径没有空格。注意:路径中的斜杠方向在Windows中可以是正斜杠或反斜杠,但最好使用正斜杠或双反斜杠。2.**检查编译器是否可用**:打开命令提示符,导航到上述路径,运行`gcc--version`,看是否能够正确输出GCC版本。如果不能,说明编译器可能损坏或环境变量有问题。3.**在CLion中配置工具链**:-打开CLion,进入`File->Settings->Build,Execution,Deployment->Toolchains`-在右侧,检查或添加一个MinGW工具链,将`Environment`设置为`MinGW`,然后指定`gcc.exe`的完整路径(即上面的路径)。同时,确保`CCompiler`和`C++Compiler`字段自动填充正确(通常会自动填充为相同目录下的`gcc.exe`和`g++.exe`)。4.**检查CMakeLists.txt**:确保没有错误的设置,特别是`project`命令之前的编译器设置。通常不需要在CMakeLists.txt中设置编译器路径,因为CLion会通过工具链设置。5.**清理并重新加载CMake项目**:-删除项目目录下的`cmake-build-debug`和`cmake-build-release`目录(或者任何你构建的目录)。-在CLion中,点击`File->ReloadCMakeProject`。6.**如果问题仍然存在**,可能是由于编译器不兼容或损坏。尝试重新安装MinGW,并确保选择与系统匹配的版本(32位或64位)。安装后,重复上述步骤。7.**引用[4]中提到的问题**:如果之前运行的程序没有关闭,可能会导致无法重新编译。打开任务管理器,结束与项目相关的进程(例如你的程序名.exe),然后再重新构建。8.**查看错误日志**:根据引用[3],错误信息会记录在`CMakeError.log`中,该文件位于构建目录(如`cmake-build-debug/CMakeFiles/CMakeError.log`)。打开该文件,查看具体的错误原因,例如编译测试程序失败的原因。常见错误原因及解决:-编译器路径错误:重新指定正确的路径。-编译器损坏:重新安装。-权限问题:以管理员身份运行CLion,或者关闭占用文件的进程(引用[4])。-环境变量问题:确保MinGW的bin目录已添加到系统PATH环境变量中。下面是一个具体的步骤示例:**步骤1:检查编译器路径**打开文件资源管理器,导航到`D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin`,确认`gcc.exe`存在。**步骤2:在CLion中设置工具链**-打开CLion,进入设置(File->Settings)-选择:Build,Execution,Deployment->Toolchains-点击“+”添加一个MinGW工具链-在Environment中选择MinGW-在“Make,CCompiler,C++Compiler”中,分别指定:Make:自动检测或手动指定为`D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/mingw32-make.exe`CCompiler:`D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/gcc.exe`C++Compiler:`D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/g++.exe`**步骤3:重新加载CMake项目**-删除项目下的cmake-build-*目录-在CLion中,Tools->CMake->ResetCacheandReloadProject如果按照以上步骤操作后问题仍然存在,请检查MinGW版本是否与系统兼容(例如64位系统需要64位MinGW)以及是否安装了必要的组件(gcc-core,gcc-g++,binutils等)。希望这些步骤能帮助您解决问题。§§相关问题§§1.如何在CLion中配置多个构建工具链?2.如何解决CMake项目中的链接错误?3.如何优化CLion的构建速度?4.如何为CMake项目添加外部库依赖?5.如何调试CMake脚本?</think>以下是解决 CLion 中 CMake C 编译器错误的完整指南,基于您提供的错误信息和引用内容: ### 一、问题诊断 根据引用[2]和引用[3],错误核心是: ```cmake The CMAKE_C_COMPILER: D:/.../gcc.exe is not a full path and was not found in the PATH ``` 这表示 CMake 无法找到有效的 C 编译器路径,可能由以下原因导致: 1. **路径格式错误**(引用[2]) 2. **编译器文件损坏**(引用[4]) 3. **进程占用导致权限问题**(引用[4]) ### 二、解决方案步骤 #### 步骤 1:验证编译器路径 1. 打开文件资源管理器,导航到: ``` D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/ ``` 2. 检查是否存在以下文件: - `gcc.exe`(C编译器) - `g++.exe`(C++编译器) - `mingw32-make.exe`(构建工具) #### 步骤 2:在 CLion 中配置工具链 1. 打开 CLion → `File` → `Settings` → `Build, Execution, Deployment` → `Toolchains` 2. 删除现有配置,点击 `+` 添加新配置 3. 按以下示例设置: ```plaintext Name: MinGW-18.0 Environment: MinGW Make: D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/mingw32-make.exe C Compiler: D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/gcc.exe C++ Compiler: D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/g++.exe ``` 4. 点击 `Apply` 保存 #### 步骤 3:解决进程占用问题(引用[4]) 1. 按 `Ctrl+Shift+Esc` 打开任务管理器 2. 查找并结束以下进程: - 您的程序名.exe - mingw32-make.exe - cmake.exe 3. 如果无法结束,使用强制删除: - 打开腾讯电脑管家 → 工具箱 → 文件粉碎 - 添加路径: ``` D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/ ``` #### 步骤 4:修改 CMakeLists.txt 在项目根目录的 `CMakeLists.txt` 中添加编译器路径强制指定: ```cmake cmake_minimum_required(VERSION 3.10) project(YourProjectName) # 强制指定编译器路径 [^2] set(CMAKE_C_COMPILER "D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/gcc.exe") set(CMAKE_CXX_COMPILER "D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW/bin/g++.exe") # 添加可执行文件 add_executable(YourProjectName main.cpp) ``` #### 步骤 5:清理并重建项目 1. 在 CLion 中: - `File` → `Invalidate Caches` → 选择 `Invalidate and Restart` 2. 重启后: - 删除项目中的 `cmake-build-*` 目录 - 点击 `Reload CMake Project` 按钮(工具栏右侧) ### 三、验证解决方案 1. 创建测试文件 `main.cpp`: ```cpp #include <iostream> int main() { std::cout << "Compiler test successful!" << std::endl; return 0; } ``` 2. 运行程序,如果输出成功则表示配置正确 ### 四、预防措施 1. **路径管理最佳实践**: ```cmake # 使用CMake变量避免硬编码路径 set(MINGW_PATH "D:/Sketchpad5.06/Sketchpad5/Evoker12345/Creation/c-c++/MinGW/mingw-18.0/MinGW") set(CMAKE_C_COMPILER "${MINGW_PATH}/bin/gcc.exe") ``` 2. **环境变量配置**: - 添加系统环境变量: ``` Path += D:\Sketchpad5.06\Sketchpad5\Evoker12345\Creation\c-c++\MinGW\mingw-18.0\MinGW\bin ``` ### 五、常见错误处理表 | 错误现象 | 解决方案 | 引用来源 | |---------|---------|---------| | "is not a full path" | 检查路径斜杠方向(用`/`代替`\`) | [^2] | | "permission denied" | 结束占用进程或强制删除 | [^4] | | 编译器测试失败 | 重装MinGW或验证编译器版本 | [^3] | | 缓存冲突 | 执行`Invalidate Caches` | [^1] | > **重要提示**:如果使用 Qt 项目,确保在 `CMakeLists.txt` 中添加 `find_package(Qt5 REQUIRED COMPONENTS Core)` 并正确配置 Qt 路径(引用[1])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值