在macOS Catalina上用CLion+CMake构建Xerces-C++项目遇x86_64符号缺失错误
一步步解决你的CMake链接错误问题
我来帮你逐个拆解这些链接错误,这类问题基本都是CMake配置没覆盖到依赖或源码导致的,咱们一步步来:
1. 先搞定Xerces-C++的符号缺失问题
你看到的xercesc_3_2::XMLAttDefList相关符号找不到,说明CMake没正确链接Xerces-C++库:
- 首先确认你已经通过Homebrew安装了对应版本:
brew install xerces-c(如果是手动编译的,要记住安装路径) - 在根目录的CMakeLists.txt里,必须正确查找并链接Xerces-C++:
# 明确指定需要3.2版本,匹配你项目里的依赖 find_package(XercesC 3.2 REQUIRED) # 链接时要把库加进去 target_link_libraries(YourExecutableName ${XercesC_LIBRARIES}) # 别忘了包含头文件目录 include_directories(${XercesC_INCLUDE_DIR}) - 如果是手动编译的Xerces-C++,需要先设置
XercesC_DIR指向它的cmake配置目录,比如:set(XercesC_DIR "/usr/local/xerces-c/lib/cmake/XercesC")
2. 解决自定义类(NodesManager、DeltaConstructor)的符号缺失
这两个是你项目里的自定义类,说明你的CMake没把它们的源文件加入编译:
- 检查src目录的CMakeLists.txt,是不是漏加了这些类的
.cpp文件?最好手动列出所有源文件(比GLOB更可靠),比如:add_executable(YourExecutableName main.cpp NodesManager.cpp DeltaConstructor.cpp # 其他所有需要编译的.cpp文件 ) - 确保根目录的CMakeLists.txt正确引入了src子目录:
add_subdirectory(src)
3. 解决_main入口缺失问题
这个错误说明CMake没找到包含int main()的主程序文件:
- 找到你项目里的主入口文件(比如
main.cpp、AppMain.cpp之类的),把它明确加入add_executable的源文件列表里,就像上面示例里的main.cpp那样 - 如果你的项目本来是库项目,但现在要编译成可执行文件,就必须添加主入口文件;如果是库项目,应该用
add_library而不是add_executable
4. 其他依赖(opencascade、libuv、libev)的配置
这些依赖也要在CMake里正确处理:
# 处理OpenCASCADE find_package(OpenCASCADE REQUIRED) include_directories(${OpenCASCADE_INCLUDE_DIR}) target_link_libraries(YourExecutableName ${OpenCASCADE_LIBRARIES}) # 处理libuv和libev,用pkg-config更方便 find_package(PkgConfig REQUIRED) pkg_check_modules(LIBUV REQUIRED libuv) pkg_check_modules(LIBEV REQUIRED libev) include_directories(${LIBUV_INCLUDE_DIRS} ${LIBEV_INCLUDE_DIRS}) target_link_libraries(YourExecutableName ${LIBUV_LIBRARIES} ${LIBEV_LIBRARIES})
最后几个小提醒
- 尽量不要用
file(GLOB_RECURSE)自动收集源文件,手动列出来能避免漏加或误加文件 - 清理CMake缓存后重新构建:在CLion里可以点击
File -> Reload CMake Project,或者直接删除build目录后重新配置 - 检查你的项目源码里,是不是有些类的实现文件被误放在了CMake没覆盖的目录里
内容的提问来源于stack exchange,提问作者Milos Cuculovic
相关产品推荐
相关产品推荐

