标签: ldflags

如何在makefile中使用LDFLAGS

我是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时,它的工作原理).

makefile ldflags

64
推荐指数
3
解决办法
19万
查看次数

如何在CMakeLists.txt中设置LDFLAGS?

我通过CMAKE_C_FLAGS在CMake中设置了CFLAGS.是这样设置LDFLAGS?

gcc makefile cmake ld ldflags

61
推荐指数
4
解决办法
10万
查看次数

如何在makefile中指定RPATH?

我正在尝试在二进制文件中指定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)

makefile rpath gnu-make ld ldflags

15
推荐指数
1
解决办法
3万
查看次数

如何在golang中使用LDFLAGS的相对路径

我是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中使用相对路径?,以便我可以在任何路径上构建项目.谢谢!

path relative-path go ldflags cgo

7
推荐指数
1
解决办法
7731
查看次数

Yocto fido -> Morty 更新 dnsmasq 没有 GNU_HASH

因此,我的任务是将我们基于 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 是不是坏主意,如果是这样,如何解决?

ldflags yocto

5
推荐指数
1
解决办法
1874
查看次数

为什么带有 ldflag `-X` 的 `build` 仅在指定文件名时才起作用?

我有文件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从原始目录执行时,变量被传递。我不确定这是否是预期的,或者这是一个错误。

linker build go ldflags

5
推荐指数
0
解决办法
1352
查看次数

如何使用Automake为"noinst"类库设置LDFLAGS?

假设我已经开发了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.

automake ldflags

4
推荐指数
1
解决办法
2568
查看次数

DLDFLAGS和LDFLAGS之间有什么区别

一个简单的问题.我在示例Makefile中找到了"DLDFLAGS"和"LDFLAGS".使用的编译器是gcc.看起来它们都用于连接器.我想知道它们之间有什么区别.

linker gcc makefile ldflags

4
推荐指数
1
解决办法
9970
查看次数

为什么LDFLAGS将我的库放在生成未定义引用的目标文件之前?

这是发生了什么.

$ 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.如何确保链接器的提示到命令行的末尾?

c makefile ld ldflags

2
推荐指数
1
解决办法
82
查看次数

正确构建本地python3,支持bz2

我正在尝试构建 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)

python bzip2 python-3.x ldflags cflags

2
推荐指数
1
解决办法
3609
查看次数

LDFLAGS的意义是什么?

我正在尝试为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的可能值是什么

谢谢 !!

cross-compiling linux-kernel ldflags

1
推荐指数
1
解决办法
1万
查看次数