【问题标题】:Undefined Reference Error When Trying to Build Project With .C and .CPP Files Using CLion尝试使用 CLion 使用 .C 和 .CPP 文件构建项目时出现未定义的引用错误
【发布时间】: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.c static 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


【解决方案1】:

我能够通过将extern "C" {#include "ranlib.h"} 添加到ne_headers.h 文件中的#include "ranlib.h" 来构建项目

【讨论】:

  • 我正要写关于extern "C"的评论。很好的收获:)
猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 2020-06-16
  • 2021-04-25
  • 2010-10-31
  • 1970-01-01
  • 2016-12-19
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多