我是Linux OS的新手.我正在尝试.c使用makefile 编译文件.必须链接数学库.我的makefile看起来像这样:
CC=gcc
CFLAGS=-Wall -lm
all:client
.PHONY: clean
clean:
rm *~ *.o client
Run Code Online (Sandbox Code Playgroud)
当我运行时make,我收到以下错误:
"undefined reference to rint"
Run Code Online (Sandbox Code Playgroud)
所以它无法链接数学库.
但是当我使用明确编译时
gcc client.c -lm -o client
Run Code Online (Sandbox Code Playgroud)
它成功编译.
那么我应该如何更改我的makefile以使其正常工作.我已经尝试过添加LDFLAGS=-lm.但我得到了同样的错误.
我还应该补充一点,当我跑步时make,它会扩展到
gcc -Wall -lm client.c -o client
Run Code Online (Sandbox Code Playgroud)
(请注意,当我最后gcc明确地运行-lm时,它的工作原理).
我通过CMAKE_C_FLAGS在CMake中设置了CFLAGS.是这样设置LDFLAGS?
我正在尝试在二进制文件中指定rpath.我的makefile看起来像这样 -
CC=gcc
CFLAGS=-Wall
LDFLAGS= -rpath='../libs/'
main: main.c
gcc -o main main.c
clean:
rm -f main main.o
Run Code Online (Sandbox Code Playgroud)
但是当我使用命令查询rpath时,我readelf -a ./main | grep rpath没有得到任何东西我已经尝试指定rpath,LDFLAGS= "-rpath=../libs/"但即使这似乎也不起作用.
有人可以发一个例子来说明我应该如何在makefile中指定rpath?
GCC和ld版本是 -
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
GNU ld (GNU Binutils for Ubuntu) 2.21.0.20110327
Run Code Online (Sandbox Code Playgroud) 我是Golang的新手,我正在尝试构建一个使用静态库(.a文件)的golang程序
我的项目的目录结构如下
??testserver
??bin
??pkg
??src
??logging
??testserver
??libtest.a
??test.go
Run Code Online (Sandbox Code Playgroud)
test.go中的cgo标志如下
// #cgo LDFLAGS: -L /home/test/testserver/src/testserver -ltest
// #include "test.h"
import "C"
Run Code Online (Sandbox Code Playgroud)
当我使用LDFLAGS -L的绝对路径时,它会产生罚款,但是当我将路径更改为相对路径时,例如
// #cgo LDFLAGS: -L ./testserver -ltest
Run Code Online (Sandbox Code Playgroud)
然后运行该命令
go install testserver
Run Code Online (Sandbox Code Playgroud)
它向我返回一个错误,并说"找不到-ltest"
我的问题是如何在LDFLAGS中使用相对路径?,以便我可以在任何路径上构建项目.谢谢!
因此,我的任务是将我们基于 yocto 的系统从 fido 升级到 morty。我对 yocto 的经验很少,我一直在努力解决它并试图理解它近一个星期。我已经设法解决了一些问题,但现在我在尝试构建图像时遇到了一个问题:
dnsmasq-2.68-r0 do_package_qa: QA Issue: No GNU_HASH in the elf binary: '/oe/.../dnsmasq/2.68-r0/packages-split/dnsmasq/usr/bin/dnsmasq'
Run Code Online (Sandbox Code Playgroud)
我在网上寻找解决方案,我确实找到了一种通过添加以下内容来抑制错误的方法:
INSANE_SKIP_${PN} = "ldflags"
Run Code Online (Sandbox Code Playgroud)
在食谱中。
但是,我不相信这是“正确”的方法,我在另一个食谱中使用了它,但也有同样的问题。我还发现有人有类似的问题,重新排列包可以解决问题,但我不知道该怎么做。
所以我的问题是:在所有有这个问题的食谱中添加 crazy_skip 是不是坏主意,如果是这样,如何解决?
我有文件playground.go:
package main
import (
"fmt"
)
var GitCommit string
func main() {
fmt.Printf("Hello world, version: %s\n", GitCommit)
}
Run Code Online (Sandbox Code Playgroud)
为什么构建 ldflag 的行为-X取决于指定源文件名?:
# CASE 1
$ go build -ldflags "-X main.GitCommit=abc" && ./go_playground
Hello world, version:
$ go tool nm go_playground
52a900 D main.GitCommit
# CASE 2
$ go build -ldflags "-X main.GitCommit=abc" playground.go && ./playground
Hello world, version: abc
$ go tool nm playground
5242f0 D main.GitCommit
4c5678 R main.GitCommit.str
Run Code Online (Sandbox Code Playgroud)
编辑:当情况 1 从符号链接目录执行时,似乎会发生问题;当情况1从原始目录执行时,变量被传递。我不确定这是否是预期的,或者这是一个错误。
假设我已经开发了libfoo.a作为编译过程的中间步骤.这是Makefile.am中的行:
noinst_LIBRARIES = libfoo.a
Run Code Online (Sandbox Code Playgroud)
这个lib依赖于其他库.为了防止我得到未定义的引用错误,我需要设置它的LDFLAGS变量.这是我做的:
libfoo_a_LDFLAGS = `pkg-config --ldflags some_lib`
Run Code Online (Sandbox Code Playgroud)
但是,automake失败并显示以下消息:
variable `libfoo_a_LDFLAGS` is defined but no program or library has `libfoo_a` as canonical name (possible typo)
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?它适用于libfoo_a_SOURCES和_CFLAGS.
一个简单的问题.我在示例Makefile中找到了"DLDFLAGS"和"LDFLAGS".使用的编译器是gcc.看起来它们都用于连接器.我想知道它们之间有什么区别.
这是发生了什么.
$ LDFLAGS=-ltestu01 make exemplo
cc -ltestu01 exemplo.c -o exemplo
/home/melba/tmp/ccO2KkjG.o: In function `main':
exemplo.c:(.text+0x6e): undefined reference to `unif01_CreateExternGenBits'
exemplo.c:(.text+0x7e): undefined reference to `bbattery_SmallCrush'
exemplo.c:(.text+0x8a): undefined reference to `unif01_DeleteExternGenBits'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'exemplo' failed
make: *** [exemplo] Error 1
%
Run Code Online (Sandbox Code Playgroud)
我期待命令cc exemplo.c -o exemplo -ltestu01.如何确保链接器的提示到命令行的末尾?
我正在尝试构建 python3 的本地版本(特别是 python3.7,但与 3.6.6 相同的问题),但是在链接到某些 C 库和/或头文件时遇到了问题(至少这是我认为的问题)是)。
我能够构建 python3.7,但遇到 bzip2 的问题(但我怀疑还会有其他我不知道的系统库)。这在尝试导入需要它作为导入错误的各种包/模块时表现出来:
ModuleNotFoundError: No module named '_bz2'
Run Code Online (Sandbox Code Playgroud)
从这个stackoverflow question - Ask Question - 看来我已经构建了没有正确bz2标头的python。python 构建本身不会失败。
具体问题是如何用bz2搭建本地版本的python?更一般地,问题是如何正确链接到系统库?(因为可能还有其他人我没有遇到错误)
就我所尝试的而言 - 我发现了这个(陈旧的)问题 - 你如何将 bz2 分配给 python 的 altinstall?和这个最近的问题Compiling bz2 support in python2并尝试了一些基于这些的东西。
我遇到的第一个问题实际上是找到正确的库等进行链接(上述问题中的解决方案建议设置CFLAGS="-I/path/to/bz2/include"和LDFLAGS="-L/path/to/bz2/lib")。大概这些在我的系统上的某个地方(ubuntu 16.04),因为系统安装的 python2.7 和 python3.5 与 bzip2 没有问题。
我发现libbz2.so.1(和其他一些)/lib/x86_64-linux-gnu/- 但文件夹似乎没有遵循上面示例/答案的模式。因此,我构建了一个新的本地版本的 bz2(在.bzp我的本地文件夹中),然后在尝试构建 python3.7 时尝试链接到该版本,使用以下命令:
./configure --prefix=/home/user/.localpython CFLAGS="-I/home/user/.bz2/include" LDFLAGS="-L/home/user/.bz2/lib"
Run Code Online (Sandbox Code Playgroud)
我还尝试了一个更通用的配置(它松散地基于Compile Python with bz2 support,链接到上面的第二篇文章中。)
./configure --prefix=/home/user/.python CFLAGS="-I/usr/local/include" …Run Code Online (Sandbox Code Playgroud) 我正在尝试为ARM linux编译AODV.我使用SabreLite作为内核版本3.0.35_4.1.0的板.值得一提的是,我正在使用openembedded为我的主板创建Linux发行版.AODV源代码(http://sourceforge.net/projects/aodvuu/)有一个README文件,它提供了一些关于如何在ARM上安装它的指示.(http://w3.antd.nist.gov/wctg/aodv_kernel/kaodv_arm.html).
我能够升级makefile以便与2.6之后的内核版本一起使用(如上所述,我有3.0.35_4.1.0内核版本).所以,基本上,我要做的是我必须创建一个模块(比如说file.ko),然后将它加载到ARM中(使用insmod file.ko命令).
为此,我使用交叉编译器,其中的一些值如下所示:
echo $ CC:arm-oe-linux-gnueabi-gcc -march = armv7-a -mthumb-interwork -mfloat-abi = hard -mfpu = neon -mtune = cortex-a9 --sysroot =/usr/local/oecore- x86_64的/ sysroots/cortexa9hf-VFP氖-OE-Linux的gnueabi
echo $ ARCH = arm
echo $ CFLAGS:O2 -pipe -g -feliminate-unused-debug-types
echo $ LD:arm-oe-linux-gnueabi-ld --sysroot =/usr/local/oecore-x86_64/sysroots/cortexa9hf-vfp-neon-oe-linux-gnueabi
echo $ LDFLAGS:-Wl,-O1 -Wl, - hash-style = gnu -Wl, - as-needed -Wl, - as-needed
当我启动"make命令"时,我收到以下错误:
LD [M] /home/scof/script_emulation/AODV/aodv-uu/lnx/kaodv.o
arm-oe-linux-gnueabi-ld:无法识别的选项'-Wl,-O1'
arm-oe-linux-gnueabi-ld:使用--help选项获取用法信息
它表明链接器有问题.这个链接器来自交叉编译工具,我通常不应该触摸它.
无论如何,为了解决以上错误,我尝试撤消LDFLAGS,如下所示: export LDFLAGS ='',之后,make命令工作,我得到模块kaodv.ko.但是当我将它插入我的ARM进行检查时,它不起作用.它实际上冻结了我的终端
所以我的问题是,编译时是否必须指定LDFLAGS?撤销LDFLAGS是否会对生成的内核模块产生影响.实际上,我试图了解可能出现问题的地方,唯一能找到的是我不应该手动改变LDFLAGS.但如果我不改变de LDFLAGS,我会得到无法识别的选项错误.
我的第二个问题是,在ARM编译中LDFLAGS的可能值是什么
谢谢 !!