#c #reference #linker
#c #ссылка #компоновщик
Вопрос:
Это может быть дубликат, но все ответы на вопросы, которые я видел, недостаточно ответили на мой вопрос, поэтому я все равно публикую.
Мой код как таковой. Очень простой. Скопируйте и вставьте с другого веб-сайта.
#include <GL/glew.h> // include GLEW and new version of GL on Windows
#include <GLFW/glfw3.h> // GLFW helper library
#include <stdio.h>
int main() {
// start GL context and O/S window using the GLFW helper library
if (!glfwInit()) {
fprintf(stderr, "ERROR: could not start GLFW3n");
return 1;
}
// uncomment these lines if on Apple OS X
/*glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);*/
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello Triangle", NULL, NULL);
if (!window) {
fprintf(stderr, "ERROR: could not open window with GLFW3n");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
// start GLEW extension handler
glewExperimental = GL_TRUE;
glewInit();
// get version info
const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
const GLubyte* version = glGetString(GL_VERSION); // version as a string
printf("Renderer: %sn", renderer);
printf("OpenGL version supported %sn", version);
// tell GL to only draw onto a pixel if the shape is closer to the viewer
glEnable(GL_DEPTH_TEST); // enable depth-testing
glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
/* OTHER STUFF GOES HERE NEXT */
// close GL context and any other GLFW resources
glfwTerminate();
return 0;
}
Я использовал CodeBlocks. В папке «include» у меня есть каталоги для этих файлов (GL / GLFW). Как вы можете видеть, они #включены в начало кода.
Однако это возвращает длинный список ошибок «неопределенной ссылки». Я видел, как люди упоминают компоновщики и предлагают длинную серию кода без объяснения, куда его поместить. Я не знаю, что такое компоновщики, или, скорее, я не знаю, какой код я должен придумать или где его разместить, чтобы это сработало.
Было бы весьма полезно получить четкое объяснение и практическую помощь.
Комментарии:
1. Можете ли вы поделиться списком ошибок компоновщика и тем, какой компилятор и ОС вы используете? Это единственный способ, который мы можем посоветовать.
2. Вам нужно связать библиотеку во время компиляции, простое включение заголовка не сработает. Заголовок просто предоставляет API, но библиотека предоставит реализацию.
3. Вам нужно беспокоиться не только о самом коде. Компоновщик — это один из этапов компиляции, который проходит совсем немного после фазы кода.
4. Спасибо всем за ваши комментарии. Однако я все еще не понимаю, КУДА мне нужно поместить код. «Вам нужно связать библиотеку во время компиляции» — Как мне это сделать? Code: Blocks также, похоже, не позволяет мне копировать и вставлять вывод ошибки. Это буквально просто путь к файлу и «неопределенная ссылка на ‘glfwInit’ и неопределенная ссылка на ‘glfwCreateWindow’ и тому подобное
Ответ №1:
Процесс преобразования исходного кода C в исполняемую программу состоит из нескольких этапов:
- Предварительная обработка
- Сборник
- Сборка
- Связывание
Однако обычно вы просто запускаете g , который затем запускает разные программы, которые выполняют по одному шагу каждая. Вот почему вы можете указать, например, аргументы для компоновщика в командной строке для g , они просто будут переданы компоновщику.
Итак, для вашей проблемы: вам нужно связать библиотеки, содержащие символы (функции, методы и т.д.), Которые вы хотите использовать. Какие библиотеки и где они находятся, можно определить, не видя сообщений об ошибках. Но поскольку вы включаете заголовки GL, вам, скорее всего, нужно связать что-то вроде libgl …
Аргументами компоновщика являются -L для указания местоположения (= directory), в котором находятся библиотеки, и -l для библиотек, которые нужно связать. ‘lib’ в имени библиотеки, а также суффикс файла библиотеки (.so, .a) могут быть опущены, например, -lpthread связывает библиотеку libpthread.so .
Комментарии:
1. Где бы мне это сделать? Поместил бы я это в свой код?
2. Нет, вы передаете параметры в g , например: ‘g myglprog.cpp -I … -o myglprog -L/usr/local/gl -lgl’ — Это всего лишь пример, вы должны найти правильный путь к библиотеке и имя файла самостоятельно!
3. Спасибо за помощь, Рене. Еще один вопрос. Когда вы связываете файлы, должны ли они быть относительно местоположения файла проекта (cpp и т.д.) Или они должны быть относительно местоположения установки IDE (например, #include GLFW / glfw.h)
4. Ни то, ни другое. Вы указываете путь или несколько путей, где компоновщик должен искать библиотеки, с аргументом -L . Там вы обычно указываете абсолютный путь (как в примере выше, /usr/local/ или, что более вероятно, /usr/local/lib). И название библиотеки часто можно найти на странице руководства к используемой вами функции / классу.