0

我目前正在尝试编写一个用于另一个程序的 DLL。在这个 DLL 中,我使用了 boost::thread 中需要 boost::system 的条件变量。我想静态链接 boost 库,以便我的程序只需要我的 dll 而不需要 boost。

我能够静态链接线程库,这样我就不需要为我的程序提供 boost 线程 dll。但是,我无法使用 boost::system 进行静态链接。到目前为止,只有当我动态链接它时它才会起作用。静态地,编译程序时出现以下编译错误

E:\boost\boost_1_53_0\boost\system\error_code.hpp|214|undefined reference to `boost::system::generic_category()'|

这是构建 dll 时的控制台输出

-------------- Build: Debug in myProgram_DLL ---------------

mingw32-g++.exe  -Wall -g -DBUILD_DLL -DBOOST_THREAD_USE_LIB -DBOOST_SYSTEM_NO_DEPRECATED    -I"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\include" -IE:\boost\boost_1_53_0  -c "Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\src\MyProgramMessage.cpp" -o obj\Debug\src\MyProgramMessage.o
mingw32-g++.exe  -Wall -g -DBUILD_DLL -DBOOST_THREAD_USE_LIB -DBOOST_SYSTEM_NO_DEPRECATED    -I"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\include" -IE:\boost\boost_1_53_0  -c "Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\src\MessageQueue.cpp" -o obj\Debug\src\MessageQueue.o
mingw32-g++.exe  -Wall -g -DBUILD_DLL -DBOOST_THREAD_USE_LIB -DBOOST_SYSTEM_NO_DEPRECATED    -I"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\include" -IE:\boost\boost_1_53_0  -c "Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -shared -Wl,--output-def=bin\Debug\libmyProgram_DLL.dll.def -Wl,--out-implib=bin\Debug\libmyProgram_DLL.dll.a -Wl,--dll -LE:\boost\boost_1_53_0\bin.v2\libs\thread\build\gcc-mingw-4.4.1\debug\link-static\runtime-link-static\threading-multi -LE:\boost\boost_1_53_0\bin.v2\libs\system\build\gcc-mingw-4.4.1\debug\link-static\runtime-link-static\threading-multi  obj\Debug\src\MyProgramMessage.o obj\Debug\src\MessageQueue.o obj\Debug\main.o   -o bin\Debug\myProgram_DLL.dll  -luser32 -lboost_thread-mgw44-mt-sd-1_53 -lboost_system-mgw44-mt-sd-1_53 
Creating library file: bin\Debug\libmyProgram_DLL.dll.a
Output size is 2.10 MB
Process terminated with status 0 (0 minutes, 2 seconds)
0 errors, 0 warnings

这是构建测试程序时的控制台输出

-------------- Build: Debug in myProgram_DLL_Test ---------------

mingw32-g++.exe -Wall  -g    -I"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL" -IE:\boost\boost_1_53_0 -IE:\boost\boost_1_53_0\bin.v2\libs -I"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\src" -I"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\include"  -c "Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL_Test\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LE:\boost\boost_1_53_0 -L"Z:\Eigene Dateien Server\Andre\myProgram\myProgram_DLL\bin\Debug"  -o bin\Debug\myProgram_DLL_Test.exe obj\Debug\main.o    -lmyProgram_DLL 
obj\Debug\main.o: In function `_static_initialization_and_destruction_0':
E:/boost/boost_1_53_0/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
E:/boost/boost_1_53_0/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
E:/boost/boost_1_53_0/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)
3 errors, 0 warnings

如果我将以下文件链接到我的测试程序,它将编译

E:\boost\boost_1_53_0\bin.v2\libs\system\build\gcc-mingw-4.4.1\debug\link-static\runtime-link-static\threading-multi\libboost_system-mgw44-mt-sd-1_53

我发现很多线程与我的错误有关,但只有那些涉及将 boost::system 链接到项目的线程。我想避免这种情况,只将 boost::system 链接到我的 DLL

如何正确链接所有内容,以便我不需要将 boost 系统链接到我的测试程序,只链接到我的 DLL?我正在使用代码块,boost 1.53 和 MinGW 4.4.1

提前致谢

4

1 回答 1

0

好的,

我已经解决了我的问题。这与我包含标题的方式有关。我在我的 dll 头文件中定义了我的类头文件,因此,当我在我的 exe 项目中包含 dll 头文件时,它希望我链接一些在类中使用的 boost 库等。

通过将包含移动到我的 dll main.cpp,问题得到了解决。我现在只需要将 myDLL 链接到我的 exe 项目

例如,我有这样的包含:

我的DLL.h

#include "myClass1.h"
#include "myClass2.h"

main.cpp // 我的 exe 项目

#include "myDLL.h"

我现在有这样的:

main.cpp // 我的 dll 项目

#include "myDLL.h"
#include "myClass1.h"
#include "myClass2.h"

main.cpp // 我的 exe 项目

#include "myDLL.h"
于 2013-09-25T12:15:06.307 回答