“clang:错误:链接器命令失败,退出代码为1”,“ld:符号未找到架构x86_64”

时间:2015-08-13 21:49:03

标签: c++ c xcode linker cmake

是的,请稍等,这可能是一个很长的问题,这里解决了一个相关问题(我认为):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'炸药究竟意味着什么呢?

它正在与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

与以往一样,任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

Em ...未定义的符号是_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,那么程序将起到魅力作用。