使用 CPP 和 ASM 的 CMake 项目
CMake project with CPP and ASM
尝试在CPP中制作带有外部ASM功能的hello world工程
CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(TestProject VERSION 0.1 LANGUAGES CXX ASM)
set_property(SOURCE foo.s APPEND PROPERTY COMPILE_OPTIONS "-x" "assembler-with-cpp")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(TestProject main.cpp foo.s)
target_include_directories(TestProject PUBLIC
"${PROJECT_BINARY_DIR}"
)
foo.s
.text
.globl _foo
_foo:
add %esi, %edi // add x and y
mov %edi, %eax // move result to correct register for return value
ret
main.cpp
#include <iostream>
using namespace std;
int foo(int x, int y);
int main() {
int result = foo(100, 200);
cout << result << endl;
}
我可以为我的 IDE 成功生成项目
cmake .. -G Xcode
如果我在 IDE 中构建它,我会收到此错误:
Error
Undefined symbol: foo(int, int)
如果我尝试从终端构建
cmake --build ..
我在 CMakeCache.txt 中遇到错误:
Error: could not load cache
CPP(仅限)项目在机器上构建良好。
假设生成的有问题CMakeCache.txt但是可以得到
CMakeCache.txt:
https://pastebin.com/BSbZfA67
您已声明 foo
具有 C++ 链接,但将其定义为具有 C 链接。要解决此问题,请声明 foo
改为使用 C 链接:
extern "C" int foo(int x, int y);
尝试在CPP中制作带有外部ASM功能的hello world工程
CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(TestProject VERSION 0.1 LANGUAGES CXX ASM)
set_property(SOURCE foo.s APPEND PROPERTY COMPILE_OPTIONS "-x" "assembler-with-cpp")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(TestProject main.cpp foo.s)
target_include_directories(TestProject PUBLIC
"${PROJECT_BINARY_DIR}"
)
foo.s
.text
.globl _foo
_foo:
add %esi, %edi // add x and y
mov %edi, %eax // move result to correct register for return value
ret
main.cpp
#include <iostream>
using namespace std;
int foo(int x, int y);
int main() {
int result = foo(100, 200);
cout << result << endl;
}
我可以为我的 IDE 成功生成项目
cmake .. -G Xcode
如果我在 IDE 中构建它,我会收到此错误:
Error
Undefined symbol: foo(int, int)
如果我尝试从终端构建
cmake --build ..
我在 CMakeCache.txt 中遇到错误:
Error: could not load cache
CPP(仅限)项目在机器上构建良好。 假设生成的有问题CMakeCache.txt但是可以得到
CMakeCache.txt: https://pastebin.com/BSbZfA67
您已声明 foo
具有 C++ 链接,但将其定义为具有 C 链接。要解决此问题,请声明 foo
改为使用 C 链接:
extern "C" int foo(int x, int y);