Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

bibliotecas estaticas (e não dinâmicas)

No meu_programa, preciso que as bibliotecas: curl,cjson, crypto e ssl sejam estáticas. Venho utilizando o seguinte makefile:

CC = gcc
CFLAGS = -Wall -Iheader
LDFLAGS = -lcurl -lcjson

SRC_DIR = source
OBJ_DIR = obj
BIN_DIR = bin

SRC = $(wildcard $(SRC_DIR)/*.c)
OBJ = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC))
EXECUTABLE = $(BIN_DIR)/meu_programa

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJ)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -rf $(OBJ_DIR)/*.o $(EXECUTABLE)

.PHONY: all clean

Quando rodei o comando ldd meu-programa, vi que as bibliotecas são dinâmicas (extensão .so). O que devo alterar no makefile para que todas as bibliotecas sejam estáticas (extensão .a)?

ldd meu-programa

2 respostas

Oii, Alberto, tudo certo contigo?

Para garantir que as bibliotecas sejam vinculadas estaticamente ao seu programa, você precisa fazer algumas alterações no seu Makefile. Primeiro, você precisa ter as versões estáticas dessas bibliotecas instaladas no seu sistema. É comum elas terem a extensão .a e podem ser encontradas nos diretórios de bibliotecas padrão do sistema (podem precisar ser instaladas separadamente).

Você pode alterar o Makefile para vincular estaticamente as bibliotecas especificadas deste modo:

  • Localize as bibliotecas estáticas (arquivos .a) no seu sistema. Se elas não estiverem presentes, você pode precisar instalá-las ou compilá-las a partir do código-fonte.

  • Modifique a variável LDFLAGS para incluir o caminho completo para cada arquivo de biblioteca estática, ou use a opção -static para forçar a vinculação estática. No entanto, a opção -static pode vincular todas as bibliotecas estaticamente, o que pode não ser o que você deseja.

  • Remova -lcurl, -lcjson, -lcrypto e -lssl do LDFLAGS e substitua pelos caminhos completos das bibliotecas estáticas (ou adicione a opção -static antes dessas opções).

Aqui está um exemplo de como o Makefile pode ficar após as alterações:

CC = gcc
CFLAGS = -Wall -Iheader
LDFLAGS = -static -lcurl -lcjson -lcrypto -lssl

SRC_DIR = source
OBJ_DIR = obj
BIN_DIR = bin

SRC = $(wildcard $(SRC_DIR)/*.c)
OBJ = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC))
EXECUTABLE = $(BIN_DIR)/meu_programa

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJ)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -rf $(OBJ_DIR)/*.o $(EXECUTABLE)

.PHONY: all clean

Se outra dúvida surgir, estamos aqui.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.
solução!

Maria Isabel, tentei usar -static no LDFLAGS para que todas as bibliotecas fossem vinculadas estaticamente, porém, ocorreu uma série de referências indefinidas (como você orientou). Diante disso, tentei vincular somente a curl estáticamente. Localizei-a através do comando:LOCATE_LIBCURL_ASubstituí no LDFLAGS, de :-lcurl para:-L/usr/lib/x86_64-linux-gnu -l:libcurl.a no makefile, conforme abaixo:

CC = gcc
CFLAGS = -Wall -Iheader
LDFLAGS = -lcjson -L/usr/lib/x86_64-linux-gnu -l:libcurl.a

SRC_DIR = source
OBJ_DIR = obj
BIN_DIR = bin

SRC = $(wildcard $(SRC_DIR)/*.c)
OBJ = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC))
EXECUTABLE = $(BIN_DIR)/meu_programa

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJ)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -rf $(OBJ_DIR)/*.o $(EXECUTABLE)

.PHONY: all clean

porém, uma série de referências indefinidas. Diante disso, vou tentar compilar a libcurl por completo, de forma que eu consiga vinculá-la estaticamente. Isabel, obrigado pela passagem de conhecimento e pró atividade.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software