Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.1K
Views
CMake vincula una biblioteca compartida a bibliotecas estáticas

Estoy transfiriendo un proyecto de AutoTools a CMake.

Qué hace AutoTools:

  • construye algunas bibliotecas estáticas
  • construye algunas bibliotecas compartidas y vincula las estáticas a las compartidas
  • construye un ejecutable, lo vincula a bibliotecas compartidas

Lo que he logrado hacer con CMake:

  • construir algunas bibliotecas estáticas - add_library(staticfoo <src>)
  • construir algunas bibliotecas compartidas - add_library(sharedfoo SHARED <src>) y vincularlas - target_link_libraries(sharedfoo staticfoo)
  • cree un ejecutable, vincúlelo a bibliotecas compartidas: target_link_libraries(exe sharedfoo) , pero eso también arrastró las bibliotecas estáticas nuevamente.

Entonces, el comando de enlace resultante para el ejecutable tiene bibliotecas estáticas además de compartidas. Lo cual no corresponde al comando generado por el proyecto AutoTools.

target_link_libraries(sharedfoo PRIVATE staticfoo) , pero eso no hace que los símbolos de la biblioteca estática entren en la interfaz de la biblioteca compartida.

¿Cómo obtener los símbolos sin ese comportamiento 'transitivo'?

(en forma independiente de la plataforma)

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Como sé, CMake no permite mezclar bibliotecas ESTÁTICAS y COMPARTIDAS.

Si su biblioteca staticfoo se usa únicamente como parte de otras bibliotecas/ejecutables, puede definirla como

 add_library(staticfoo OBJECT <src>)

y úselo como una especie de fuente cuando construya otra biblioteca:

 add_library(sharedfoo SHARED <src> $<TARGET_OBJECTS:staticfoo>)

Para obtener más información, consulte la documentación en add_library .

over 4 years ago · Santiago Trujillo Report

0

Para resolver este caso, debe hacer algunas cosas:

  • en primer lugar, asegúrese de haber compilado bibliotecas estáticas con -fPIC , de modo que contengan un código reubicable (que sería parte de una biblioteca compartida más adelante)
  • luego, debe controlar la visibilidad de los símbolos al compilar todas las bibliotecas, por lo que, al ser parte de la biblioteca compartida, los símbolos provenientes de la estática serían visibles
  • y finalmente, sí, debe especificar PRIVATE <static libs> al vincular su biblioteca compartida, por lo que la línea de comando del enlazador para su ejecutable no tendría ninguna librería estática
over 4 years ago · Santiago Trujillo Report

0

Mira mi respuesta aquí . Básicamente agregue /WHOLEARCHIVE , -all_load o --whole-archive a las banderas del enlazador.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!