bounty将在5天后过期。回答此问题可获得+50的声誉奖励。avighnac正在寻找来自声誉良好来源的答案:如果你能在答案中包含一个完整的例子,包括项目结构和每个相关文件的内容,那就太好了。
这是图书馆。图书馆。
section .text
global return_number
return_number:
mov eax, 10
ret
我可以很容易地使用命令行创建一个共享的静态库:
nasm -f elf64 -o library.o library.asm
ld -shared -o libreturn_number.so library.o
ar rcs libreturn_number.a library.o
但是,使用CMake会出现问题。CMakeLists.txt:
enable_language(ASM_NASM)
project(mylibrary)
set(CMAKE_ASM_NASM_CREATE_SHARED_LIBRARY "<CMAKE_ASM_NASM_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_ASM_NASM_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
add_library(mylibrary_static STATIC library.asm)
add_library(mylibrary_shared SHARED library.asm)
静态库工作得非常好,但是共享库会抛出一些奇怪的错误。
CMakeFiles/mylibrary_shared.dir/library.asm.o:1: error: label or instruction expected at start of line
CMakeFiles/mylibrary_shared.dir/library.asm.o:10: error: label or instruction expected at start of line
CMakeFiles/mylibrary_shared.dir/library.asm.o:11: error: label or instruction expected at start of line
CMakeFiles/mylibrary_shared.dir/library.asm.o:12: error: label or instruction expected at start of line
CMakeFiles/mylibrary_shared.dir/library.asm.o:31: warning: label alone on a line without a colon ...
"o“文件中的几乎每一行。
2条答案
按热度按时间sczxawaw1#
自定义工具链设置最好在 * 工具链文件 * 中完成。您可以为NASM编写一个工具链文件,并在默认情况下将其附加到项目中,如下所示:
cmake/nasm-toolchain.cmake
:注意,此处使用
<CMAKE_LINKER>
是为了允许使用例如lld
或mold
。CMakeLists.txt
:注意,对于many reasons,最好避免为共享库和静态库创建单独的目标,而使用
BUILD_SHARED_LIBS
。∮ ∮ ∮ ∮ ∮一米六一分
同上,但为完整起见,在此复制:
构建输出:
共享库(64位):
共享库(32位):
静态库:
mm5n2pyu2#
问题是你试图使用nasm编译器来链接对象二进制文件,你应该使用ld链接器甚至gcc,所以nasm正在读取对象文件并说wtf是这样的!
下面的解决方案使用的是与上面相同的asm文件。
对于64位,CMakeLists.txt为
对于32位:
生产