编译.c:体系结构x86_64的未定义符号

时间:2014-11-07 00:05:40

标签: c bash gsl

我有一些预先存在的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

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

生成文件

这是我的makefile:

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。

2 个答案:

答案 0 :(得分:3)

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

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

-lgsl告诉链接器ld(自动在gcc之后调用)将可执行文件链接到libgsl。我不知道你在那做什么。在Makefile中,只需在-lgsl之后添加-o cli_exec即可。 E.g:

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

答案 1 :(得分:-1)

可能你的电脑没有GNU科学图书馆(GSL)。 你可以先安装它, install-gnu-scientific-library-gsl-on-ubuntu, 然后运行编译。