CMake 错误与 gtkmm
CMake error with gtkmm
我正在使用 Debian 8 并安装了 libgtkmm-3.0(以及 -dev)。现在我有一个使用 gtkmm 的非常简单的程序,基本上是一个 Hello World:
main.cpp:
#include "../include/BrowserWindow.class.hpp"
#include <gtkmm/application.h>
int main(int argv, char *argc[])
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
BrowserWindow helloworld;
//Shows the window and returns when it is closed.
return app->run(helloworld);
}
BrowserWindow.class.cpp:
#include "../include/BrowserWindow.class.hpp"
#include <iostream>
BrowserWindow::BrowserWindow()
: m_button("Hello World")
{
set_border_width(10);
m_button.signal_clicked().connect(sigc::mem_fun(*this, &BrowserWindow::on_button_clicked));
add(m_button);
m_button.show();
}
BrowserWindow::~BrowserWindow()
{
}
void BrowserWindow::on_button_clicked()
{
std::cout << "Hello World" << std::endl;
}
BrowserWindow.class.hpp:
#ifndef VB_BROWSERWINDOW_CLASS_H
#define VB_BROWSERWINDOW_CLASS_H
#include <gtkmm/button.h>
#include <gtkmm/window.h>
class BrowserWindow : public Gtk::Window
{
public:
BrowserWindow();
virtual ~BrowserWindow();
protected:
void on_button_clicked();
Gtk::Button m_button;
};
#endif
现在,如果我使用 pkg-config gtkmm-3.0 --cflags 和 pkg-config gtkmm-3.0 --libs 手动或使用自制的 makefile 编译它,一切正常。但是,使用 CMake 我会遇到编译错误。 运行 cmake 没问题:
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.28")
-- checking for module 'gtkmm-3.0'
-- found gtkmm-3.0, version 3.14.0
-- Configuring done
-- Generating done
-- Build files have been written to: bla/bla/build
运行 make 是现在的问题:
projectdir/hardsource/main.cpp: In function ‘int main(int, char**)’:
projectdir/hardsource/main.cpp:6:102: error: no matching function for call to ‘Gtk::Application::create(char**&, int&, const char [18])’
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
后面是一些我可能想表达的潜在 "candidates" 功能...
CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.2)
project(myproject)
find_package(PkgConfig)
pkg_check_modules(GTKMM gtkmm-3.0)
link_directories(${GTKMM_LIBRARY_DIRS})
include_directories(include ${GTKMM_INCLUDE_DIRS})
file(GLOB SOURCES "hardsource/*.cpp")
add_executable(mybinary ${SOURCES})
target_link_libraries(mybinary ${GTKMM_LIBRARIES})
我比较了使用手动 pkg-config 生成的编译器标志(包括和 lib)和由 cmake 的 pkg-config 生成的编译器标志。两者完全相同。
那么,怎么了? :/
您在 main 函数中交换了 argc
和 argv
。变化:
int main(int argv, char *argc[])
进入
int main(int argc, char *argv[])
见What does int argc, char *argv[] mean?
附带说明一下,我怀疑它是否真的在使用自制的 Makefile。也许您并没有真正编译所有文件。
我正在使用 Debian 8 并安装了 libgtkmm-3.0(以及 -dev)。现在我有一个使用 gtkmm 的非常简单的程序,基本上是一个 Hello World:
main.cpp:
#include "../include/BrowserWindow.class.hpp"
#include <gtkmm/application.h>
int main(int argv, char *argc[])
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
BrowserWindow helloworld;
//Shows the window and returns when it is closed.
return app->run(helloworld);
}
BrowserWindow.class.cpp:
#include "../include/BrowserWindow.class.hpp"
#include <iostream>
BrowserWindow::BrowserWindow()
: m_button("Hello World")
{
set_border_width(10);
m_button.signal_clicked().connect(sigc::mem_fun(*this, &BrowserWindow::on_button_clicked));
add(m_button);
m_button.show();
}
BrowserWindow::~BrowserWindow()
{
}
void BrowserWindow::on_button_clicked()
{
std::cout << "Hello World" << std::endl;
}
BrowserWindow.class.hpp:
#ifndef VB_BROWSERWINDOW_CLASS_H
#define VB_BROWSERWINDOW_CLASS_H
#include <gtkmm/button.h>
#include <gtkmm/window.h>
class BrowserWindow : public Gtk::Window
{
public:
BrowserWindow();
virtual ~BrowserWindow();
protected:
void on_button_clicked();
Gtk::Button m_button;
};
#endif
现在,如果我使用 pkg-config gtkmm-3.0 --cflags 和 pkg-config gtkmm-3.0 --libs 手动或使用自制的 makefile 编译它,一切正常。但是,使用 CMake 我会遇到编译错误。 运行 cmake 没问题:
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.28")
-- checking for module 'gtkmm-3.0'
-- found gtkmm-3.0, version 3.14.0
-- Configuring done
-- Generating done
-- Build files have been written to: bla/bla/build
运行 make 是现在的问题:
projectdir/hardsource/main.cpp: In function ‘int main(int, char**)’:
projectdir/hardsource/main.cpp:6:102: error: no matching function for call to ‘Gtk::Application::create(char**&, int&, const char [18])’
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
后面是一些我可能想表达的潜在 "candidates" 功能...
CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.2)
project(myproject)
find_package(PkgConfig)
pkg_check_modules(GTKMM gtkmm-3.0)
link_directories(${GTKMM_LIBRARY_DIRS})
include_directories(include ${GTKMM_INCLUDE_DIRS})
file(GLOB SOURCES "hardsource/*.cpp")
add_executable(mybinary ${SOURCES})
target_link_libraries(mybinary ${GTKMM_LIBRARIES})
我比较了使用手动 pkg-config 生成的编译器标志(包括和 lib)和由 cmake 的 pkg-config 生成的编译器标志。两者完全相同。
那么,怎么了? :/
您在 main 函数中交换了 argc
和 argv
。变化:
int main(int argv, char *argc[])
进入
int main(int argc, char *argv[])
见What does int argc, char *argv[] mean?
附带说明一下,我怀疑它是否真的在使用自制的 Makefile。也许您并没有真正编译所有文件。