好的,请继续,这可能会很长,这里解决了一个相关问题(我认为):CMake make[2]: *** No rule to make target `/path/to/uthash/utarray.h', needed by `HelloTest'. Stop .
几天来,我一直在努力构建一个简单的“Hello World”程序,该程序混合了 C 和 C++,并使用 CMake 引入了各种外部库。为了全面披露,应该知道我对 C、C++ 和 CMake 还很陌生,因此请保持友善。
我在 OS X Yosemite 10.10.4 中工作(我的谷歌搜索似乎表明这可能是问题的一部分)。我正在使用 CLion IDE。
唉,我们开始吧,这是我正在尝试构建的程序:
#include <iostream>
#include "Simbody.h" \\Written in C++
extern "C"
{
#include "project_in_C.h"
}
using namespace std;
using namespace SimTK;
int main(int argc, char** argv) {
cout << "Hello, World!" << endl;
return 0;
}
我们有一个用 C++
编写的物理库,一个用 C
编写的定制项目,我们称其为主要头文件; project_in_C.h
.
再次;我要做的就是构建一个简单的混合 C/C++
项目。
现在,上面的代码是使用 CMake 执行的,下面的 CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.2)
project(HelloTest)
# Simbody
find_package(Simbody REQUIRED)
include_directories(${Simbody_INCLUDE_DIR})
link_directories(${Simbody_LIB_DIR})
# Project C Headers
set(PROJC_ROOT_DIR "/Users/usr/project-c")
set(PROJC_INCLUDE_DIR ${PROJC_ROOT_DIR}/src
${PROJC_ROOT_DIR}/dir1
${PROJC_ROOT_DIR}/dir2)
include_directories(${PROJC_INCLUDE_DIR})
# Check that it has found the most important header
find_path(projFound project_in_C.h PATHS "/Users/usr/project-c/src")
if(NOT projFound)
message(FATAL_ERROR "Cannot find folder containing project_in_C.h")
endif()
# Project C Source [we want to avoid globbing]
set(PROJC_SOURCE ${PROJC_ROOT_DIR}/src/file1.c
${PROJC_ROOT_DIR}/src/file2.c
${PROJC_ROOT_DIR}/src/file3.c
${PROJC_ROOT_DIR}/src/file4.c
${PROJC_ROOT_DIR}/dir1/file5.c)
# Make library from source files
add_library(PROJC_LIBRARIES ${PROJC_SOURCE})
# Tie together
set(SOURCE_FILES main.cpp)
add_executable(HelloTest ${SOURCE_FILES})
target_link_libraries(HelloTest ${Simbody_LIBRARIES} ${PROJC_LIBRARIES})
到目前为止一切顺利,但真正神秘的问题出现了。构建后,这是我得到的返回:
/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/usr/Library/Caches/clion10/cmake/generated/c1d0f54d/c1d0f54d/Debug --target all -- -j 2
Scanning dependencies of target HelloTest
[ 91%] Built target PROJC_LIBRARIES
[100%] Building CXX object CMakeFiles/HelloTest.dir/main.cpp.o
Linking CXX executable HelloTest
Undefined symbols for architecture x86_64:
"_program_execution_wrapper", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [HelloTest] Error 1
make[1]: *** [CMakeFiles/HelloTest.dir/all] Error 2
make: *** [all] Error 2
但是这个 flippin' dynamite 到底意味着什么?
它在 project_in_C.h
上大惊小怪,其中错误似乎指的部分是这样写的:
int program_execution_wrapper(int argc, char **argv);
int __program(int argc, char **argv);
#define main main(int argc, char **argv) { return program_execution_wrapper(argc, argv); } int __program
一如既往,非常感谢任何帮助。
最佳答案
Em...Undefined symbols is _program_execution_wrapper
...我在你的程序中没有看到这个符号。这可能是您帖子中的错字吗?如果将 project_in_C.h
中的代码从 prog_exec_wrapper
更改为 program_execution_wrapper
会怎样?而且,此功能未在您的代码中实现。首先尝试这样的事情:
int program_execution_wrapper(int argc, char **argv) { printf("%s", "something"); }
根据您的评论进行编辑: 请参阅以下示例: 我们有两个文件 (main.cpp)
#include <iostream>
int sum(int a, int b);
int main()
{
int a = sum(3, 5);
std::cout << a << std::endl;
return 0;
}
和文件 sum.cpp
#include <iostream>
int sum(int a, int b)
{
return a+b;
}
所以我想编译这个程序......它会像这样
g++ main.cpp
我收到以下错误:
Undefined symbols for architecture x86_64:
"sum(int, int)", referenced from:
_main in main-22f955.o
ld: symbol(s) not found for architecture x86_64
但是如果我在我的主程序中包含 sum.cpp,那么该程序就会像 charm 一样工作。
关于c++ - "clang: error: linker command failed with exit code 1"上 "ld: symbol(s) not found for architecture x86_64",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31999008/