将 GCC(G++) ASM 对象与 .cpp 对象链接起来不起作用(对...的未定义引用)
Linking GCC(G++) ASM object with .cpp objects not working(undefined reference to...)
我有两个函数需要直接在 ASM 上编写,因为 GCC 在编译这些函数时会包含 pre/post 调用代码,而我不希望这样。
假设它是不可变的:我必须直接在 asm 上编译两个函数。
两个函数实现为:
.intel_syntax
.text
.globl Func1
.def Func1; .scl 2; .type 32; .endef
Func1:
push 1
push esp
mov eax, 0xDEADBEEF
call eax
ret
.globl Func2
.def Func2; .scl 2; .type 32; .endef
Func2:
ret
我正在使用 g++ -c asm.S -o asm.o 生成对象。那行得通!我有一个 asm.o 没有 error/warnning.
但是,当编译所有代码时:
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\Test.exe ../Test/asm.o release/main.o release/mainwindow.o release/funcs.o release/qrc_a.o release/moc_mainwindow.o -lpsapi -lOleAut32 -lmingw32
我收到以下错误:
release/funcs.o:funcs.cpp:(.text+0x5c4): undefined reference to `Func2()'
release/funcs.o:funcs.cpp:(.text+0x5d0): undefined reference to `Func1(HINSTANCE__*)'
release/funcs.o:funcs.cpp:(.text+0x6a5): undefined reference to `Func1(HINSTANCE__*)'
所以链接器找不到 Func1 和 Func2 对象...但是我在编译时包含了 asm.o(at ../Test/asm.o),所以我不知道出了什么问题:(.
感谢您的帮助o/
顺便说一句:我正在使用 MinGW 的 g++ (GCC) 4.8.1,所以我在 Windows 环境中。
链接器正在寻找函数 Func1()
而不仅仅是符号名称 Func1
,因此它将寻找与该函数的错位名称相匹配的符号。你还没有定义任何这样的符号,你已经定义了 Func1
而不是一个损坏的名字。
您需要在 C++ 文件中将函数声明为 extern "C"
,以便链接器只查找您在 asm.
中定义的 Func1
C++ 编译器正在查找名称错位的函数(具有调用参数类型)。
extern "C" int func1();
也许 asm => _func1
.
我有两个函数需要直接在 ASM 上编写,因为 GCC 在编译这些函数时会包含 pre/post 调用代码,而我不希望这样。
假设它是不可变的:我必须直接在 asm 上编译两个函数。
两个函数实现为:
.intel_syntax
.text
.globl Func1
.def Func1; .scl 2; .type 32; .endef
Func1:
push 1
push esp
mov eax, 0xDEADBEEF
call eax
ret
.globl Func2
.def Func2; .scl 2; .type 32; .endef
Func2:
ret
我正在使用 g++ -c asm.S -o asm.o 生成对象。那行得通!我有一个 asm.o 没有 error/warnning.
但是,当编译所有代码时:
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\Test.exe ../Test/asm.o release/main.o release/mainwindow.o release/funcs.o release/qrc_a.o release/moc_mainwindow.o -lpsapi -lOleAut32 -lmingw32
我收到以下错误:
release/funcs.o:funcs.cpp:(.text+0x5c4): undefined reference to `Func2()'
release/funcs.o:funcs.cpp:(.text+0x5d0): undefined reference to `Func1(HINSTANCE__*)'
release/funcs.o:funcs.cpp:(.text+0x6a5): undefined reference to `Func1(HINSTANCE__*)'
所以链接器找不到 Func1 和 Func2 对象...但是我在编译时包含了 asm.o(at ../Test/asm.o),所以我不知道出了什么问题:(.
感谢您的帮助o/
顺便说一句:我正在使用 MinGW 的 g++ (GCC) 4.8.1,所以我在 Windows 环境中。
链接器正在寻找函数 Func1()
而不仅仅是符号名称 Func1
,因此它将寻找与该函数的错位名称相匹配的符号。你还没有定义任何这样的符号,你已经定义了 Func1
而不是一个损坏的名字。
您需要在 C++ 文件中将函数声明为 extern "C"
,以便链接器只查找您在 asm.
Func1
C++ 编译器正在查找名称错位的函数(具有调用参数类型)。
extern "C" int func1();
也许 asm => _func1
.