【问题标题】:compiling .c: Undefined symbols for architecture x86_64编译 .c:架构 x86_64 的未定义符号
【发布时间】:2014-11-07 00:05:40
【问题描述】:

我有一些预先存在的 C 代码(由其他人编写)应该可以正常工作,我只是想编译它并在我的计算机上运行它。当我尝试使用 makefile 创建可执行文件时,我收到以下消息:

Undefined symbols for architecture x86_64:
  "_gsl_ran_binomial", referenced from:
      _develop in develop.o
      _developAllRNAs in develop.o
      _developWithFeedback in develop.o
  "_gsl_ran_exponential", referenced from:
      _randomOrg in G.o
      _mutateBigK in G.o
      _rpois in develop.o
  [And some other gsl_related issues]
  "_gsl_rng_uniform_int", referenced from:
      _randomOrg in G.o
      _mutateTrait in G.o
      _mutateDBM in G.o
      _substitutions in G.o
      _makeGamete in G.o
ld: symbol(s) not found for architecture x86_64

我尝试重新安装 gsl (sudo port install gsl) 但错误消息仍然存在。在谷歌搜索我的错误消息时,我看到很多点击,但到目前为止没有任何帮助。

生成文件

这是我的生成文件:

LIBS = libs
INCLUDE_PATH=libs/

cli_exec: libraries
    gcc cli/makepopulation.c $(wildcard libraries/*) -I$(INCLUDE_PATH) -o cli_exec

libraries:
    mkdir libraries/
    for dir in $(LIBS); do \
        cd $$dir; \
        gcc -c *.c -I../; \
        mv *.o ../libraries; \
        cd -; \
    done


clean:
    rm -rf libraries/ make_exec

我有点复制粘贴了我在网上找到的这个 makefile,但并没有得到太多。我编辑了我的问题以添加我的makefile。基本上,我的函数 int main{} 在名为 metapopulation.c 的文件中,该文件位于 cli 目录中。 libs 目录包含所有其他 .c 和 .h 文件。并通过libraries函数在名为libraries的目录中编译并调用.o。

【问题讨论】:

  • 你在图书馆链接了吗?显示您用于链接的命令行。
  • @PaulGriffiths 感谢您的评论。请参阅我更新的问题。希望这是你所要求的。在 Bash 中,命令行make cli_execlibraries 函数似乎工作正常,我只收到cli-exec 的错误。我应该以某种方式链接到我的gsl 目录吗?我实际上通过编写#include<this/is/a/path/gsl/gsl_randist.h> 链接到每个.c 文件中的gsl 目录
  • 确认您将-lgsl 传递给链接器,并且-L/path/to/libgsl 在库搜索路径中(应该是,但请检查)
  • @DavidC.Rankin 我不太明白什么是“链接器”,也不明白什么是“图书馆搜索路径”。不,我没有通过(至少没有主动/有意识地)-lgsl
  • 你有你的 Makefile,但我没有在其中任何地方看到对 lgsl 的具体引用。当您使用 libgsl 构建时,您的最小编译字符串为 gcc -Wall -Wextra -o progname progname.c -lgsl-lgsl 告诉链接器 ld(在 gcc 之后自动调用)将可执行文件链接到 libgsl。我不明白你在哪里这样做。在您的 Makefile 中,只需在 -o cli_exec 之后添加 -lgsl 即可。

标签: c bash gsl


【解决方案1】:

我在您的Makefile 的任何地方都没有看到对lgsl 的具体引用。当您使用libgsl 构建时,您的最小编译字符串为:

gcc -Wall -Wextra -o progname progname.c -lgsl

-lgsl 告诉链接器ld(在 gcc 之后自动调用)将可执行文件链接到 libgsl。我不明白你在哪里这样做。在您的Makefile 中,只需在-o cli_exec 之后添加-lgsl 就可以了。例如:

gcc cli/makepopulation.c $(wildcard libraries/*) -I$(INCLUDE_PATH) -o cli_exec -lgsl

【讨论】:

  • 非常感谢@DavidCRankin
【解决方案2】:

您的 PC 可能没有 GNU Scientific Library (GSL)。 可以先安装 install-gnu-scientific-library-gsl-on-ubuntu, 然后运行编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 2013-09-16
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多