ld не связывает статическую библиотеку, потому что она считает, что библиотека не нужна, но мне нужна эта библиотека [duplicate]

Чтобы решить эту проблему без добавления новых правил из react/recommended, установите eslint-plugin-react:

npm i eslint-plugin-react --save

добавьте .eslintrc.js:

"plugins": ["react"]

и:

"rules": {   
     "react/jsx-uses-react": "error",   
     "react/jsx-uses-vars":
     "error" 
}
29
задан Martin 2 January 2013 в 05:12
поделиться

4 ответа

Используйте опцию --whole-archive linker.

Библиотеки, которые приходят после , в командной строке не будут отброшены символы без ссылок. Вы можете возобновить нормальное поведение связи, добавив --no-whole-archive после этих библиотек.

В вашем примере команда будет:

g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a

В общем случае это будет:

g++ -o program main.o \
    -Wl,--whole-archive -lmylib \
    -Wl,--no-whole-archive -llib1 -llib2
45
ответ дан Alex B 22 August 2018 в 04:14
поделиться
  • 1
    Кто-нибудь знает, есть ли более тонкий контроль над этим, например, используя видимость DSO? Я собираюсь пометить несколько функций, которые нужно принудительно включить. См. gcc.gnu.org/wiki/Visibility – csl 15 March 2016 в 13:21
  • 2
    Пользователь должен в любом случае добавить -Wl,-no-whole-archive в конец. Поскольку man ld говорит: "Во-вторых, не забудьте использовать -Wl,-no-whole-archive после списка архивов, потому что gcc добавит свой собственный список архивов к вашей ссылке, и вы не можете хотите, чтобы этот флаг также влиял на них. & quot; – Sasha 8 December 2016 в 20:19
  • 3
    @csl, возможно stackoverflow.com/a/43894291/192373 отвечает на ваш вопрос? – Alex Cohn 10 May 2017 в 13:45

Если в статической библиотеке есть определенная функция, которая лишена компоновщиком как неиспользованная, но вам это действительно нужно (одним из примеров является функция JNI_OnLoad ()), вы можете заставить компоновщик сохранить ее (и, естественно, весь код, который вызывается из этой функции). Добавьте -u JNI_OnLoad в свою ссылку.

2
ответ дан Alex Cohn 22 August 2018 в 04:14
поделиться
  • 1
    Алекс, я пытался использовать whole-archive с NDK Android и CMake без успеха, и я думаю, что использование флага -u компоновщика - мой единственный вариант. Как бы вы это сделали в НДК? И есть ли другая альтернатива для этого на Android, о которой вы знаете? (Я не могу использовать LOCAL_WHOLE_STATIC_LIBRARIES , потому что я использую CMake вместо android.mk) – Jaime Ivan Cervantes 4 April 2018 в 04:54

Исходное предложение было «близко»:

Попробуйте следующее: -Wl,--whole-archive -lyourlib

6
ответ дан Community 22 August 2018 в 04:14
поделиться

Мне нравятся другие ответы лучше, но вот еще одно «решение».

  1. Используйте команду ar для извлечения всех файлов .o из архива.
    cd mylib ; ar x /path/to/libmylib.a
    
  2. Затем добавьте все эти файлы .o в команду компоновщика
    g++ -o program main.o mylib/*.o
    
4
ответ дан melpomene 22 August 2018 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: