C++ 如何使用我从源代码构建的库,而不是为自己的项目编译的库?

C++ 如何使用我从源代码构建的库,而不是为自己的项目编译的库?,c++,linker,mingw,asmjit,C++,Linker,Mingw,Asmjit,我想试试这个。使用“cmake”和“make”从源代码构建它没有问题,它提供的示例都经过了完美的编译和执行。我还进行了makeinstall以导出依赖项文件 然后我想使用这个库编译我自己的程序,所以我检索了生成的文件(标题和静态库),将它们添加到一个新项目中,该项目的代码是上给出的第一个示例的副本/粘贴: 下面是用于编译的命令行: g++ main.cpp -o main -Iinclude -L -lasmjit 出现第一个编译错误: In file included from includ

我想试试这个。使用“cmake”和“make”从源代码构建它没有问题,它提供的示例都经过了完美的编译和执行。我还进行了
makeinstall
以导出依赖项文件

然后我想使用这个库编译我自己的程序,所以我检索了生成的文件(标题和静态库),将它们添加到一个新项目中,该项目的代码是上给出的第一个示例的副本/粘贴:

下面是用于编译的命令行:

g++ main.cpp -o main -Iinclude -L -lasmjit
出现第一个编译错误:

In file included from include/asmjit/./core.h:2008,
                 from include/asmjit/asmjit.h:27,
                 from main.cpp:1:
include/asmjit/././core/builder.h:375:20: error: function 'asmjit::Error asmjit::BaseBuilder::dump(asmjit::String&, uint32_t) const' definition is marked dllimport
  375 |   ASMJIT_API Error dump(String& sb, uint32_t formatFlags = 0) const noexcept {
      |                    ^~~~
在对lib代码进行一些研究之后,定义
ASMJIT\u NO\u DEPRECATED
宏(请参见上面代码中的第一行注释)可防止此错误再次出现。我怀疑这是一个好主意,因为它可能是以下下一个链接错误的原因:

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x35): undefined reference to `__imp__ZN6asmjit10JitRuntimeC1EPKNS_12JitAllocator12CreateParamsE'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x45): undefined reference to `__imp__ZN6asmjit10CodeHolderC1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x6e): undefined reference to `__imp__ZN6asmjit10CodeHolder4initERKNS_11EnvironmentEy'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x82): undefined reference to `__imp__ZN6asmjit3x869AssemblerC1EPNS_10CodeHolderE'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x11f): undefined reference to `__imp__ZN6asmjit3x869AssemblerD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x12f): undefined reference to `__imp__ZN6asmjit10CodeHolderD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x142): undefined reference to `__imp__ZN6asmjit10JitRuntimeD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x159): undefined reference to `__imp__ZN6asmjit3x869AssemblerD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x169): undefined reference to `__imp__ZN6asmjit10CodeHolderD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x17c): undefined reference to `__imp__ZN6asmjit10JitRuntimeD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text$_ZN6asmjit11BaseEmitter4emitIJRKNS_3x862GpEiEEEjjDpOT_[_ZN6asmjit11BaseEmitter4emitIJRKNS_3x862GpEiEEEjjDpOT_]+0x4c): undefined reference to `__imp__ZN6asmjit11BaseEmitter6_emitIEjRKNS_8Operand_ES3_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text$_ZN6asmjit11BaseEmitter4emitIJEEEjjDpOT_[_ZN6asmjit11BaseEmitter4emitIJEEEjjDpOT_]+0x1b): undefined reference to `__imp__ZN6asmjit11BaseEmitter6_emitIEj'
collect2.exe: error: ld returned 1 exit status
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x35):未定义对“\uu imp\uu ZN6asmjit10JitRuntimeC1EPKNS”的引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x45):对“\uu imp\uu zn6asmjit10coderkeholder1ev”的未定义引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/./../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x6e):未定义对“\uu imp\uu ZN6asmjit10CodeHolder4initERKNS”的引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../../../x86_64-w64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x82):未定义对“\uu imp\uu zn6asmjit3x869assemble1epns\u10codeholdere”的引用
C:/msys64/mingw64/bin/。/lib/gcc/x86_64-w64-mingw32/10.1.0/。/../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x11f):未定义对“\uu imp\uu zn6asmjit3x869assembler1ev”的引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x12f):未定义对“\uu imp\uu zn6asmjit10codeholder1ev”的引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/./../../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x142):对“\uu imp\uu ZN6asmjit10JitRuntimeD1Ev”的未定义引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x159):未定义对“\uu imp\uu zn6asmjit3x869assembler1ev”的引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x169):未定义对“\uu imp\uu zn6asmjit10codeholder1ev”的引用
C:/msys64/mingw64/bin/./lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x17c):未定义对“\uu imp\uu ZN6asmjit10JitRuntimeD1Ev”的引用
C:/msys64/mingw64/bin//lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text$zn6asmjit11baseemitter4emitjkns\u3x862geeeejdpot[\zn6asmjit11baseemitter4emitjjjjkns\3xpeeeeejdpo4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c:未定义对“\uuu imp\uuu ZN6asmjit11BaseEmitter6\u emitteejrkns\u 8操作数\u ES3”的引用
C:/msys64/mingw64/bin//lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../../x86_64-w64-mingw32/bin/ld.exe:C:\Users\\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text$zn6asmjit11baseemitter4emitter4emitterejdpot.[\zn6asmjit1baseemitter4emitter4emitter4emitterjepotejdpot++0x1b):未定义对“uimpu”的引用
collect2.exe:错误:ld返回了1个退出状态
除了定义这个宏,我找不到防止第一个错误发生的方法,我也不明白为什么链接编辑器找不到引用。我还尝试将这些依赖项(headers+static lib)放在适当的MinGW目录(即全局
include
lib
目录)中,但这不会改变任何东西

我如何编译这个程序,这是非常简单的?我还想知道为什么我所做的不起作用,知道这个错误的原因,我将来可能能够处理其他相同风格的人


PS:我在C和C++中管理外部依赖性的经验不多。我在Windows下,使用MinGW和GCC的最新版本。

您缺少
ASMJIT\u STATIC
编译时定义-如果静态使用ASMJIT,则必须定义它。AsmJit将在编译时检查此定义,以设置
AsmJit\u API
宏,该宏将扩展为编译器特定的导入/导出/可见性属性

AsmJit文档(构建说明部分)说[1]:

静态使用AsmJit的项目必须在使用AsmJit的所有编译单元中定义AsmJit_STATIC,否则AsmJit将在AsmJit_API decorator中使用动态库导入。建议在以这种方式使用AsmJit的整个项目中定义此宏

因此,在您的特定情况下,这应该可以解决问题:

g++ main.cpp -o main -Iinclude -L. -lasmjit -DASMJIT_STATIC
注意:文档链接有意链接到索引页,因此在重新组织文档后,它不会成为死链接


[1]

我已经解决了MINGW的编译时问题,谢谢!谢谢你的回复!您提出的解决方案似乎只是“保留”用于构建库,而不是用于编译使用它的可执行文件。我已经用
ASMJIT\u STATIC
参数构建了库,尽管如此,我还是尝试了您的解决方案,但不幸的是,在家里,问题再次出现
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x35): undefined reference to `__imp__ZN6asmjit10JitRuntimeC1EPKNS_12JitAllocator12CreateParamsE'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x45): undefined reference to `__imp__ZN6asmjit10CodeHolderC1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x6e): undefined reference to `__imp__ZN6asmjit10CodeHolder4initERKNS_11EnvironmentEy'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x82): undefined reference to `__imp__ZN6asmjit3x869AssemblerC1EPNS_10CodeHolderE'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x11f): undefined reference to `__imp__ZN6asmjit3x869AssemblerD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x12f): undefined reference to `__imp__ZN6asmjit10CodeHolderD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x142): undefined reference to `__imp__ZN6asmjit10JitRuntimeD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x159): undefined reference to `__imp__ZN6asmjit3x869AssemblerD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x169): undefined reference to `__imp__ZN6asmjit10CodeHolderD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text+0x17c): undefined reference to `__imp__ZN6asmjit10JitRuntimeD1Ev'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text$_ZN6asmjit11BaseEmitter4emitIJRKNS_3x862GpEiEEEjjDpOT_[_ZN6asmjit11BaseEmitter4emitIJRKNS_3x862GpEiEEEjjDpOT_]+0x4c): undefined reference to `__imp__ZN6asmjit11BaseEmitter6_emitIEjRKNS_8Operand_ES3_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\<my user name>\AppData\Local\Temp\cc4WaQ7J.o:main.cpp:(.text$_ZN6asmjit11BaseEmitter4emitIJEEEjjDpOT_[_ZN6asmjit11BaseEmitter4emitIJEEEjjDpOT_]+0x1b): undefined reference to `__imp__ZN6asmjit11BaseEmitter6_emitIEj'
collect2.exe: error: ld returned 1 exit status
g++ main.cpp -o main -Iinclude -L. -lasmjit -DASMJIT_STATIC