【发布时间】:2019-01-23 12:37:07
【问题描述】:
我正在尝试编译 MonteCarlo Simulator 程序 (https://www.stat.washington.edu/thompson/Genepi/Mcleeps.shtml)。
这是我在尝试构建项目时遇到的错误:
CMakeFiles\MonteCarlo.dir/objects.a(ne_classes.cpp.obj): In function `main':
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:90: undefined reference > to `setall(long, long)'
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:182: undefined reference > to `setall(long, long)'
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:312: undefined
reference to `getsd(long*, long*)'
CMakeFiles\MonteCarlo.dir/objects.a(ne_classes.cpp.obj): In function
`Z21draw_folded_asin_normddiiiPid':
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:1230: undefined
reference to `gennor(float, float)'
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:1236: undefined
reference to `ranf()'
CMakeFiles\MonteCarlo.dir/objects.a(ne_classes.cpp.obj): In function
`Z10RealizeNewP10LatentInfoP8GeneInfoP7LogProbi':
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:1990: undefined
reference to `gennor(float, float)'
CMakeFiles\MonteCarlo.dir/objects.a(ne_classes.cpp.obj): In function
`Z7uniformii':
C:/Users/Michael/CLionProjects/MonteCarlo/ne_classes.cpp:2111: undefined
reference to `ignuin(long, long)'
CMakeFiles\MonteCarlo.dir/objects.a(ranlib.c.obj): In function `setgmn':
C:/Users/Michael/CLionProjects/MonteCarlo/ranlib.c:1468: undefined reference
to `spofa'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [MonteCarlo.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/MonteCarlo.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/MonteCarlo.dir/rule] Error 2
这是我的 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.12)
project(MonteCarlo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_executable(MonteCarlo ne_classes.cpp com.c ranlib.c linpack.c
ne_headers.h ranlib.h)
ne_classes.cpp 包含主函数
在尝试谷歌这个问题后,我发现这可能是由于我使用不同版本的 g++ 来编译程序。这也与 .c 和 .cpp 文件之间的链接问题有关。但是我仍然不知道如何使用不同版本的 g++ 进行编译或链接问题是如何引起的。这一切都在我之上,我已经花了几个小时试图解决这个问题,所以我在这里,问这个问题,作为我最后的手段。
如果您需要我可以发布每个文件的内容,或者您可以从我上面链接的网站自己下载。
谢谢
【问题讨论】:
-
你对错误中提到的每个函数都有声明和定义吗?您是否启用了警告?
extern "C" {}是否正确包含 C 文件? -
顺便说一句。超过 2000 行对于一个文件来说是相当多的...
-
我没有写代码,所以我会尽我所能在这里尝试回答你的问题。错误中提到的功能之一是
ignuin。该函数在ne_classes.cpp中被调用,我发现它在ne_headers.h中声明,就像GLOB long ignuin(long a, long n);我不确定C 文件是否正确包含在extern "C" {}中。在ne_classes.cpp文件的顶部有一个#define UN_EXTERN。不知道有没有关系 -
啊,我明白了。你能找到这个函数是在哪里定义的吗?它的身体,要调用的指令在哪里?这是“未定义引用”错误的最常见来源。
GLOB可能是某种宏,您也可以尝试找到它。您是否已将所有源文件(.cpp、.c)添加到 CMake? -
ignuin似乎定义在ranlib.cstatic long ignuin,ign,maxnow,range,ranp1; if(!(low > high)) 转到 S10; fputs("低 > ignuin 高 - 中止",stderr);退出(1); S10:范围=高-低; if(!(range > maxnum)) 转到 S20; fputs("高 - 低在 ignuin 中太大 - 中止",stderr);退出(1); S20:如果(!(低==高))转到S30; ignuin = 低;返回 ignuin;很抱歉,我无法弄清楚如何正确格式化它以使其可读
标签: c++ c linker-errors clion undefined-reference