如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
How can I use the library that I have built without error from source, but not compiling for my own project?
我想尝试一下AsmJit库。从源代码使用"cmake"和"make"构建它没有问题,它提供的示例都经过完美编译和执行。我也make install
导出依赖项文件。
然后我想使用这个库编译我自己的程序,所以我检索了生成的文件(标头和静态库(以将它们添加到一个新项目中,该项目的代码是库网站上给出的第一个示例的复制/粘贴:
// #define ASMJIT_NO_DEPRECATED // this line is no part of the original code
#include <asmjit/asmjit.h>
#include <stdio.h>
using namespace asmjit;
// Signature of the generated function.
typedef int (*Func)(void);
int main(int argc, char* argv[]) {
JitRuntime rt; // Runtime designed for JIT code execution.
CodeHolder code; // Holds code and relocation information.
code.init(rt.environment()); // Initialize CodeHolder to match JIT environment.
x86::Assembler a(&code); // Create and attach x86::Assembler to `code`.
a.mov(x86::eax, 1); // Move one to 'eax' register.
a.ret(); // Return from function.
// ----> x86::Assembler is no longer needed from here and can be destroyed <----
Func fn;
Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
if (err) return 1; // Handle a possible error returned by AsmJit.
// ----> CodeHolder is no longer needed from here and can be destroyed <----
int result = fn(); // Execute the generated code.
printf("%dn", result); // Print the resulting "1".
// All classes use RAII, all resources will be released before `main()` returns,
// the generated function can be, however, released explicitly if you intend to
// reuse or keep the runtime alive, which you should in a production-ready code.
rt.release(fn);
return 0;
}
这是我的测试项目的层次结构的样子:
include
asmjit // The generated headers from the library build
libasmjit.a // The generated static library from the library build
main.cpp // My program's code, as pasted above
这是用于编译的命令行:
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_NO_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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.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>AppDataLocalTempcc4WaQ7J.o:main.cpp:(.text$_ZN6asmjit11BaseEmitter4emitIJEEEjjDpOT_[_ZN6asmjit11BaseEmitter4emitIJEEEjjDpOT_]+0x1b): undefined reference to `__imp__ZN6asmjit11BaseEmitter6_emitIEj'
collect2.exe: error: ld returned 1 exit status
除了定义此宏之外,我找不到防止发生第一个错误的方法,而且我也不明白为什么链接编辑器找不到引用。我还尝试将这些依赖项(标头 + 静态库(放在适当的 MinGW 目录(即全局include
和lib
目录中(,但这不会改变任何东西。
如何编译这个非常简单的程序?我也想知道为什么我所做的没有奏效,知道这个错误的原因,我将来可能能够与其他相同风格的人打交道。
PS:我在 C 和 C++ 中管理外部依赖项方面没有太多经验。我在Windows下,使用MinGW和最新版本的GCC。
你缺少编译时定义ASMJIT_STATIC
- 如果你静态使用 AsmJit,则必须定义它。AsmJit 在编译时检查此定义以设置宏ASMJIT_API
宏,该宏扩展到特定于编译器的导入/导出/可见性属性。
AsmJit 文档(构建说明部分(说 [1]:
静态使用 AsmJit 的项目必须在使用 AsmJit的所有编译单元中定义ASMJIT_STATIC,否则 AsmJit 将在ASMJIT_API装饰器中使用动态库导入。建议在以这种方式使用 AsmJit 的整个项目中定义此宏。
因此,在您的特定情况下,这应该可以解决问题:
g++ main.cpp -o main -Iinclude -L. -lasmjit -DASMJIT_STATIC
注意:文档链接故意链接到索引页,因此一旦文档重新组织,它就不会成为死链接。
[1] https://asmjit.com/doc/index.html
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将矩阵乘以我自己的输入的向量
- 如何正确包含我自己的标头?
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 预期'while'或预期'}' 之前回答是,但我自己无法修复
- 为什么__builtin_popcount比我自己的比特计数功能慢?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 如何在我自己的staticLib中使用staticLib
- 在我自己的堆栈中实现top的问题
- 尝试检查输入的文本与我自己的自定义答案
- 如何在我自己的类中重载"+"和"<<"运算符
- C++:我自己类的动态数组
- 如何在 C++ 中使用我自己的类中的库?
- 如何链接我自己的 .so 文件而不是操作系统捆绑包 .so 文件?
- 如何构建默认使用我自己的构建libc ++的clang?
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 分发我自己的程序的几个问题
- 尝试编写我自己的字符串类在 gcc 中出现异常
- Qt - 重新实现QIODevice,实时听到我自己的声音
- 使用我自己的list.sort()逻辑,试图模仿其他来源,为什么我会因为看似正确的格式而出错