如何用CMake编译纯汇编语言的静态库与共享库?
CMake构建NASM共享库报错解决方案
问题现象
静态库可正常构建,但生成共享库时出现大量类似label or instruction expected at start of line的错误,错误指向.o文件的每一行——这是因为CMake错误地用NASM去处理二进制目标文件,而非调用链接器完成共享库的链接步骤。
错误根源
你手动设置的CMAKE_ASM_NASM_CREATE_SHARED_LIBRARY变量完全错误:该变量用于定义如何链接目标文件生成共享库,但你写成了调用NASM(汇编编译器)而非链接器(如ld)。NASM会把输入的.o二进制文件当成汇编源码解析,自然会报语法错误。
修复方案
直接删除错误的set(CMAKE_ASM_NASM_CREATE_SHARED_LIBRARY ...)行即可,CMake默认会自动调用合适的链接器完成共享库构建。如果需要自定义链接命令,也要确保调用的是链接器而非NASM。
正确的CMakeLists.txt
enable_language(ASM_NASM) project(mylibrary) # 无需手动指定共享库构建命令,CMake会自动处理 add_library(mylibrary_static STATIC library.asm) add_library(mylibrary_shared SHARED library.asm) # 可选:让输出库名和命令行生成的一致(libreturn_number.a / libreturn_number.so) set_target_properties(mylibrary_static PROPERTIES OUTPUT_NAME "return_number") set_target_properties(mylibrary_shared PROPERTIES OUTPUT_NAME "return_number")
自定义链接命令(可选)
如果确实需要手动指定链接参数,正确的写法是调用ld或系统链接器:
set(CMAKE_ASM_NASM_CREATE_SHARED_LIBRARY "ld -shared -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
验证
执行以下命令构建:
mkdir build && cd build cmake .. make
会生成libreturn_number.a(静态库)和libreturn_number.so(共享库),与命令行手动构建的结果一致。
内容的提问来源于stack exchange,提问作者avighnac
相关产品推荐
相关产品推荐

