使用g++链接静态/动态库生成exe时出现未定义符号错误
链接STK静态库时的未定义符号问题及解决方法
尝试将目标文件与STK静态库、动态库链接生成可执行文件时,出现大量未定义符号错误,即使移除-ldsound参数(dsound.lib与项目文件同目录)也无法解决。
执行的g++命令:
g++ -static d:/lib/libstk.a new.o -ldsound -o new.exe
错误信息示例:
ld.lld: error: undefined symbol: __declspec(dllimport) select >>> referenced by libstk.a(Messager.cpp.obj):(socketHandler) ld.lld: error: undefined symbol: __WSAFDIsSet >>> referenced by libstk.a(Messager.cpp.obj):(socketHandler) >>> referenced by libstk.a(Messager.cpp.obj):(socketHandler) ld.lld: error: undefined symbol: __declspec(dllimport) WSAGetLastError >>> referenced by libstk.a(Messager.cpp.obj):(socketHandler) ld.lld: error: undefined symbol: __declspec(dllimport) CoInitialize >>> referenced by libstk.a(RtAudio.cpp.obj):(RtAudio::openRtApi(RtAudio::Api)) >>> referenced by libstk.a(RtAudio.cpp.obj):(RtApiDs::RtApiDs()) ld.lld: error: undefined symbol: __declspec(dllimport) CoUninitialize >>> referenced by libstk.a(RtAudio.cpp.obj):(RtApiDs::~RtApiDs()) .............and so on ..................
运行配置脚本后生成了stk-config.cmake文件,内容如下:
# Create imported target stk add_library(stk STATIC IMPORTED) set_target_properties(stk PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" INTERFACE_LINK_LIBRARIES "Threads::Threads;winmm;ole32;wsock32;dsound" )
方法一:直接修正g++命令行
从stk-config.cmake的INTERFACE_LINK_LIBRARIES字段可知,STK依赖多个系统库,只需把这些库添加到命令行即可:
g++ -static d:/lib/libstk.a new.o -lwinmm -lole32 -lwsock32 -ldsound -o new.exe
若仍报错,可调整库的顺序,将依赖库放在STK静态库之后。
方法二:使用CMake构建项目
若想利用生成的stk-config.cmake,可通过以下步骤用CMake管理构建:
- 在项目目录创建
CMakeLists.txt,内容如下:
cmake_minimum_required(VERSION 3.10) project(new_exe) # 指定stk-config.cmake所在目录 set(CMAKE_PREFIX_PATH "d:/lib") # 加载STK配置 find_package(stk REQUIRED) # 创建可执行文件 add_executable(new.exe new.o) # 链接STK库(自动引入所有依赖) target_link_libraries(new.exe PRIVATE stk)
- 执行构建命令:
mkdir build && cd build cmake .. -G "MinGW Makefiles" mingw32-make
内容的提问来源于stack exchange,提问作者Laura Bieber
相关产品推荐
相关产品推荐

