gcc -static a.c -o t -L. -lb 编译不过

时间:2022-02-15 01:47:50
#ll
#a.c b.c
#more a.c

  #include <stdio.h>
  int main()
  { 
                  b();
                  return 0;
    }

#more b.c
   

  #include <stdio.h>
  int b()
  { 
                  printf("b\n");
                  return 0;
    }

#gcc -shared -fpic b.c -libb.so
#ls
  a.c    b.c    libb.so
#gcc -static a.c -o t -L. -lb
/usr/bin/ld:can not find -ld

怎么办呢?我想把系统库和libb.so都放到t里面去。     

19 个解决方案

#1


-lbb

-static 去掉

#2


去掉就不能把系统库放进去了。有什么方法可以把系统库都放进可执行文件里了?现在我在redhat4下编译,我的目的是省得到其它系统(redhat5,6)下还要编译。

#3


怎么让程序不依赖系统库呢?

#4


你没有静态库用-static有啥用

#5


如果你只想依赖libb.so

那么
gcc -static a.c -o t -L. libb.so

#6


#gcc -static a.c -o t -L. -lb
/usr/bin/ld:can not find -ld

怎么办呢?我想把系统库(linux-gate.so.1 =>  (0xb78bf000)
/etc/libcwait.so (0xb78ba000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7744000)
/lib/ld-linux.so.2 (0xb78c0000)
)和libb.so都放到t里面去。 

#7


make dist好像也不行。怎么办呢

#8


###################项目路径和程序名称#################################
DIR=$(shell pwd)
BIN_DIR=$(DIR)/bin
LIB_DIR=$(DIR)/lib
SRC_DIR=$(DIR)/src
INCLUDE_DIR=$(DIR)/include
OBJ_DIR=$(DIR)/obj
DEPS_DIR=$(DIR)/deps
PROGRAM=$(BIN_DIR)/test
###################OBJ文件及路径############################################
EXTENSION=cpp
OBJS=$(patsubst $(SRC_DIR)/%.$(EXTENSION), $(OBJ_DIR)/%.o,$(wildcard $(SRC_DIR)/*.$(EXTENSION)))
DEPS=$(patsubst $(OBJ_DIR)/%.o, $(DEPS_DIR)/%.d, $(OBJS))
###################include头文件路径##################################
INCLUDE=\
        -I$(INCLUDE_DIR)   
###################lib文件及路径######################################
###################编译选项及编译器###################################
CC=g++
CFLAGS=-Wall -W -g 
LDFLAGS=
###################编译目标###########################################
.PHONY: all clean rebuild

all:$(OBJS) 
    @echo $(DEPS_DIR)
    $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS) 


$(DEPS_DIR)/%.d: $(SRC_DIR)/%.$(EXTENSION)
    $(CC) -MM $(INCLUDE) $(CFLAGS) $< | sed -e 1's,^,$(OBJ_DIR)/,' > $@
sinclude $(DEPS)
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.$(EXTENSION) 
    $(CC) $< -o $@ -c $(CFLAGS) $(INCLUDE) 
rebuild: clean all
clean:
    rm -rf $(OBJS)  $(PROGRAM)
一个通用的MakeFile模板。

#9


LZ的意思是想将系统动态库中的代码静态链接到你的文件中去??

#10


对,还有我自己写的动态库,如这里的libb.so。有方法吗?

#11


有办法或者没有办法

有办法的前提是你有这些东西的所有静态库

#12


你的意思是动态库.so改成静态库.a吗?
#ar cr libb.a b.c
#ranlib libb.a
#gcc -static a.c -o t -L. -lb
./libb.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status


 怎么办呢?

#13


好了,
#ar cr libb.a b.c
改成:
#gcc  -c b.c -o b.o
#ar cr libb.a b.o

去实验下

#14


没发现什么问题,可是看不到生成的t 里面是什么东西,加了-static,会包含系统库吗?

#15


如果你系统库也有静态库,那么也会一起链接进入

#16


加了-static 生成的文件比不加的大了近100倍,里面什么东东?

#17


里面有系统动态库吗?怎么分析gcc -static 生成的文件呢?求助啊

#18


动态链接库的创建分为两步:
编译目标文件,必须带上-fpic 标志,使输出的对象模块是按照可重定位地址方式生成的 
gcc -c -fpic b.c –o b.o
将加入动态库的目标文件合并在一起,必须带上-shared ,明确表示是动态链接库
gcc -shared b.o -o libb.so

两步可以合并成一步
gcc -fpic -shared b.c -o libb.so

然后是链接库并生成可执行程序
gcc  a.c -L. -lb  -o t 

系统会首选动态链接,没有则选静态链接。

#19


还是没把静态库编进去啊
分析gcc -static 生成的文件......?

#1


-lbb

-static 去掉

#2


去掉就不能把系统库放进去了。有什么方法可以把系统库都放进可执行文件里了?现在我在redhat4下编译,我的目的是省得到其它系统(redhat5,6)下还要编译。

#3


怎么让程序不依赖系统库呢?

#4


你没有静态库用-static有啥用

#5


如果你只想依赖libb.so

那么
gcc -static a.c -o t -L. libb.so

#6


#gcc -static a.c -o t -L. -lb
/usr/bin/ld:can not find -ld

怎么办呢?我想把系统库(linux-gate.so.1 =>  (0xb78bf000)
/etc/libcwait.so (0xb78ba000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7744000)
/lib/ld-linux.so.2 (0xb78c0000)
)和libb.so都放到t里面去。 

#7


make dist好像也不行。怎么办呢

#8


###################项目路径和程序名称#################################
DIR=$(shell pwd)
BIN_DIR=$(DIR)/bin
LIB_DIR=$(DIR)/lib
SRC_DIR=$(DIR)/src
INCLUDE_DIR=$(DIR)/include
OBJ_DIR=$(DIR)/obj
DEPS_DIR=$(DIR)/deps
PROGRAM=$(BIN_DIR)/test
###################OBJ文件及路径############################################
EXTENSION=cpp
OBJS=$(patsubst $(SRC_DIR)/%.$(EXTENSION), $(OBJ_DIR)/%.o,$(wildcard $(SRC_DIR)/*.$(EXTENSION)))
DEPS=$(patsubst $(OBJ_DIR)/%.o, $(DEPS_DIR)/%.d, $(OBJS))
###################include头文件路径##################################
INCLUDE=\
        -I$(INCLUDE_DIR)   
###################lib文件及路径######################################
###################编译选项及编译器###################################
CC=g++
CFLAGS=-Wall -W -g 
LDFLAGS=
###################编译目标###########################################
.PHONY: all clean rebuild

all:$(OBJS) 
    @echo $(DEPS_DIR)
    $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS) 


$(DEPS_DIR)/%.d: $(SRC_DIR)/%.$(EXTENSION)
    $(CC) -MM $(INCLUDE) $(CFLAGS) $< | sed -e 1's,^,$(OBJ_DIR)/,' > $@
sinclude $(DEPS)
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.$(EXTENSION) 
    $(CC) $< -o $@ -c $(CFLAGS) $(INCLUDE) 
rebuild: clean all
clean:
    rm -rf $(OBJS)  $(PROGRAM)
一个通用的MakeFile模板。

#9


LZ的意思是想将系统动态库中的代码静态链接到你的文件中去??

#10


对,还有我自己写的动态库,如这里的libb.so。有方法吗?

#11


有办法或者没有办法

有办法的前提是你有这些东西的所有静态库

#12


你的意思是动态库.so改成静态库.a吗?
#ar cr libb.a b.c
#ranlib libb.a
#gcc -static a.c -o t -L. -lb
./libb.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status


 怎么办呢?

#13


好了,
#ar cr libb.a b.c
改成:
#gcc  -c b.c -o b.o
#ar cr libb.a b.o

去实验下

#14


没发现什么问题,可是看不到生成的t 里面是什么东西,加了-static,会包含系统库吗?

#15


如果你系统库也有静态库,那么也会一起链接进入

#16


加了-static 生成的文件比不加的大了近100倍,里面什么东东?

#17


里面有系统动态库吗?怎么分析gcc -static 生成的文件呢?求助啊

#18


动态链接库的创建分为两步:
编译目标文件,必须带上-fpic 标志,使输出的对象模块是按照可重定位地址方式生成的 
gcc -c -fpic b.c –o b.o
将加入动态库的目标文件合并在一起,必须带上-shared ,明确表示是动态链接库
gcc -shared b.o -o libb.so

两步可以合并成一步
gcc -fpic -shared b.c -o libb.so

然后是链接库并生成可执行程序
gcc  a.c -L. -lb  -o t 

系统会首选动态链接,没有则选静态链接。

#19


还是没把静态库编进去啊
分析gcc -static 生成的文件......?

#20