我目前正在从源代码重新编译gtk +和依赖项(我没有其他选择).
我的所有自定义软件包都安装在一个特定的自定义点(让我们称之为/packages)(它看起来很奇怪,但这一次,我别无选择).
当我尝试重新编译pango时,它需要freetype.Freetype的已安装/packages/freetype/2.1.10/amd64-linux (LIB,包括......在此目录)和不同的配置路径设置(LD_LIBRARY_PATH,LIBRARY_PATH,CPLUS_INCLUDE_PATH,INCLUDE_PATH,PKG_CONFIG_PATH).pango配置运行良好.它找到freetype并生成Makefile.当我尝试制作时,我收到以下错误:
libtool: link: warning: library `/packages/freetype/2.1.10/amd64-linux//lib/libfreetype.la' was moved.
grep: /usr/local/lib/libfreetype.la: No such file or directory
Run Code Online (Sandbox Code Playgroud)
libtool我的lib有问题(但libfreetype.la存在于目录中,/packages/freetype/2.1.10/amd64-linux//lib/并且没有访问问题).所以libtool试图在"经典地方"中/usr/...找到它并且找不到它.
一开始,我认为libtool与两个斜杠混淆(可能是由于在编译freetype期间--prefix标志中的错误)所以我确实重新编译了没有拼写错误的freetype但它没有改变任何东西.
有人有意帮助我吗?我以前从未在我的个人项目中使用过libtool所以我不知道是否有办法解决这种奇怪的行为...(这可能无关紧要,但libtool是版本1.5.22)
提前致谢.
我和其他人有同样的问题:
*.la由libtool生成的文件(例如),module.la*.so它用于dlopen()(例如module.so).但是:项目已配置和构建,--disable-shared以确保创建的主二进制文件是一个大的静态链接程序,例如main.x(更容易部署和调试).因此*.so不会创建文件.
该程序main.x是一个巨大的框架式应用程序,它能够通过加载扩展(模块)dlopen()- 尽管它是静态链接的.
当我module.so手工构建时,这很好用.但是这Makefile.am对我来说似乎是不可能的.是的,我可以写lib_LTLIBRARIES,但按照我的标准,--disable-shared我没有得到*.so文件.
lib_LTLIBRARIES = module.la
module_so_SOURCES = module.cpp
Run Code Online (Sandbox Code Playgroud)
module.la创建文件,dlopen()拒绝加载(当然).
我试图将规则用于Makefile.am手动构建它并且有效:
# Makefile.am (yes, .am)
all: mm_cpp_logger.so
SUFFIXES = .so
%.so: %.cpp
$(CXX) $(CXXFLAGS) -fPIC -fpic -c -I $(top_srcdir)/include -o $@ $<
%.so: %.o
$(CXX) …Run Code Online (Sandbox Code Playgroud) 是否可以在使用automake/libtool的项目中使用gcc预编译头文件?
添加新的make规则来构建预编译头文件并不困难.问题是你还必须添加由libtool和AFAIK引入的编译标志,它无法处理标头输入文件.
你怎么能这样做?
我有一组cpp文件,我想直接编译成二进制文件,并编译成共享库.
我有
bin_PROGRAMS=mybin
lib_LTLIBRARIES=libmylib.la
COMMON_SOURCES=f1.cpp f2.cpp f3.cpp
mybin_SOURCES=main.cpp $(COMMON_SOURCES)
libmylib_la_SOURCES=$(COMMON_SOURCES)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,cpp文件被编译两次,一次使用libtool,一次没有,有时libtool/automake抱怨
Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`
Run Code Online (Sandbox Code Playgroud)
我尝试将COMMON_SOURCES放入.a文件中,但是当我将.a与.la链接时,libtool会抱怨(说它不可移植).
我需要的是类似的东西
bin_LTPROGRAMS=mybin
Run Code Online (Sandbox Code Playgroud)
但那并不存在
编辑:澄清 - 我正在使用automake/autoconf.我上面展示的是我的automake Makefile.am的内容
我有大约80个静态库.我想从中创建一个静态库.
这个答案对我不起作用,因为我收到以下错误:
libtool: unrecognized option `-static'
Run Code Online (Sandbox Code Playgroud)
我也很困惑它需要在哪种模式下完成.是"链接"还是"安装"因为有20个奇数库,我还能用"*"来指定所有吗?
我没有在文件中找到任何信息,期望这不能真正回答我的问题.
FYI ..这些是模式:
MODE must be one of the following:
clean remove files from the build directory
compile compile a source file into a libtool object
execute automatically set library path, then run a program
finish complete the installation of libtool libraries
install install libraries or executables
link create a library or an executable
uninstall remove libraries from an installed directory
Run Code Online (Sandbox Code Playgroud) 我需要gcov在我正在处理的共享库上执行一些测试覆盖.
问题是libtool将目标文件重命名为my-name.c,libmylib_la-my-name.lo并且gcov无法处理该转换.每次运行它时,cannot open notes file都会生成错误.
如果我手动重命名my-name.c到libmylib_la-my-name.c后构建gcov工作正常,所以没有其他问题,除了文件名截断.
试图提供一个最小的工作示例,我发现文件名修改只在lib..._la_CFLAGS设置时(以及设置为空值时)发生.
cat <<EOT > configure.ac
AC_INIT(sample,0.0.1)
AC_CONFIG_SRCDIR(configure.ac)
AM_INIT_AUTOMAKE(foreign)
LT_INIT
AC_PROG_CC
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
EOT
cat <<EOT > Makefile.am
lib_LTLIBRARIES=libsample.la
libsample_la_SOURCES=sample.c
# The following line triggers the filename mangling (libsample_la-sample.lo instead of sample.lo)
libsample_la_CFLAGS=
EOT
touch sample.c && autoreconf -if && ./configure && make
Run Code Online (Sandbox Code Playgroud)
有没有办法避免libtool操作的文件名修改或让我们gcov理解文件名修改方案?
在将库集成到我的 cmake 项目中时,我一直在将库的 .la 文件中的“dependency_libs”复制粘贴到变量中,然后使用“target_link_library”。
我需要以某种方式直接从 .la 文件中获取这个“dependency_libs”变量。有没有办法在 cmake 中做到这一点?如果没有,我总是可以用其他语言编写脚本来使用正则表达式解析文件,然后将其写入文件并将其导入变量。
我想构建protobuf,所以我只是在目录中克隆包和cd。当我输入 ./autogen.sh 时,发生了一些错误。 当我输入 ./autogen.sh 时, 我收到回调:
configure.ac:104: error: possibly undefined macro: AC_PROG_LIBTOOL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
autoreconf: /home/zhangxl/my/autoconf/bin/autoconf failed with exit status: 1
Run Code Online (Sandbox Code Playgroud)
有人说我应该安装 libtool,但我已经安装了 autoconf、automake、libtool 和 m4,但它们都是从源代码构建的,因为我无法获得 sudo 密码。 在此处输入图像描述 这是我的 .bashrc 文件:
export PATH=$PATH:/home/zhangxl/my/libtool/bin
export CPLUS_INCLUDE_PATH=/hpme/zhangxl/my/libtool/include:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=/home/zhangxl/my/libtool/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/home/zhangxl/my/libtool/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
我想可能 .bashrc 文件不正确,所以我想寻求帮助,非常感谢您的回答。
我正在将现有库(libtcod)直接转换为Autotools(用于OS X幸福).不幸的是,当我改变我Makefile.am的lib_LIBRARIES规则时lib_LTLIBRARIES,构建从成功转为un.摘录自以下输出:
Making all in .
make[1]: Nothing to be done for `all-am'.
Making all in src
/bin/sh ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -g -O2 -MT bresenham_c.lo -MD -MP -MF .deps/bresenham_c.Tpo -c -o bresenham_c.lo bresenham_c.c
mv -f .deps/bresenham_c.Tpo .deps/bresenham_c.Plo
mv: rename .deps/bresenham_c.Tpo to .deps/bresenham_c.Plo: No such file or directory
make[1]: *** [bresenham_c.lo] Error 1
make: *** [all-recursive] Error 1
Run Code Online (Sandbox Code Playgroud)
src/Makefile.am 看起来像这样:
lib_LTLIBRARIES = libtcod.la
libtcod_la_SOURCES = bresenham_c.c bresenham3_c.c bsp_c.c color_c.c ...
Run Code Online (Sandbox Code Playgroud)
src/.deps 包含: …
在编译时mpich,我收到了一些relinking警告......
libtool: warning: relinking 'lib/libmpicxx.la'
Run Code Online (Sandbox Code Playgroud)
我无法通过Google搜索错误消息找出这些含义.什么是relinking?为什么会引起它,我怎么能摆脱它呢?